【问题标题】:Constructor dependency Injection issue构造函数依赖注入问题
【发布时间】:2023-04-04 10:15:01
【问题描述】:

我在尝试 CI 时正在学习 DI 和新的 spring,我编写了以下代码,我认为我的语法是正确的,但它仍然显示 bean 创建错误。为什么它无法创建 bean..?? 代码是

构造函数.java

package beans;

public class Constructor {
private String name;
private int age;
private String email;

public void Constructor(String name, int age, String email){
    this.name=name;
    this.age=age;
    this.email=email;    
}

public void show()
{
    System.out.println("Name = "+name);
    System.out.println("Age = "+age);
    System.out.println("Email = "+email);
}

}

spring.xml

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
        "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
        <!-- Ordered parameters -->

        <beans>

        <bean id="t" class="beans.Constructor">

        <constructor-arg value="Alok"/>
        <constructor-arg  value="24"/>
        <constructor-arg  value="alok@gmail.com"/>

        </bean>

        </beans>

Const_main.java

package test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import beans.Constructor;

public class Const_main {
    public static void main(String[] args) {
       ApplicationContext ap= new  ClassPathXmlApplicationContext("resources/spring.xml");
        Constructor c = (Constructor)ap.getBean("t");
            c.show();

    }

}

出现以下错误

Jun 29, 2017 3:16:45 PM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@b1a58a3: startup date [Thu Jun 29 15:16:45 IST 2017]; root of context hierarchy
Jun 29, 2017 3:16:45 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [resources/spring.xml]
Jun 29, 2017 3:16:46 PM org.springframework.context.support.ClassPathXmlApplicationContext refresh
WARNING: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: **Error creating bean with name 't' defined in class path resource [resources/spring.xml]: Could not resolve matching constructor (hint: specify index/type/name arguments for simple parameters to avoid type ambiguities)
Exception in thread "main"** org.springframework.beans.factory.BeanCreationException: Error creating bean with name 't' defined in class path resource [resources/spring.xml]: Could not resolve matching constructor (hint: specify index/type/name arguments for simple parameters to avoid type ambiguities)
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:240)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1193)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1095)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
    at test.Const_main.main(Const_main.java:10)

【问题讨论】:

  • 在每个 行中添加 index = "0" / index = "1"
  • 但我认为当我们不是参数顺序时使用它..我以与构造函数中定义的顺序相同的顺序传递参数...然后它应该正常运行..? ?
  • 是的,但我认为 Spring 不会查看您的参数顺序,而是仅根据参数类型来决定。因此,为了消除歧义,最好提及参数类型或更优选的参数索引。检查这个:tutorialspoint.com/spring/…
  • 是的..我也尝试过使用它,但它没有显示任何变化..

标签: spring dependency-injection javabeans creation


【解决方案1】:

试试这个方法

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
"http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<!-- Ordered parameters -->

<beans>

<bean id="t" class="beans.Constructor">

<constructor-arg>
  <value>Alok</value>
</constructor-arg>
<constructor-arg>
  <value>24</value>
</constructor-arg>
<constructor-arg>
  <value>alok@gmail.com</value>
</constructor-arg>

</bean>

</beans>

【讨论】:

    【解决方案2】:

    您正在尝试使用构造函数依赖注入而不在 DTO 中创建任何此类构造函数 (Constructor.java)

    你上面定义的方法:

    public void Constructor(String name, int age, String email){
        this.name=name;
        this.age=age;
        this.email=email;    
    }
    

    只是一个简单的方法/函数不是构造函数,试着去掉void这个词。

    注意:

    为了消除构造函数匹配的任何歧义,更喜欢使用带有构造函数参数的索引,例如:

        <bean id="t" class="beans.Constructor"> 
          <constructor-arg value="Alok" index="0"/> 
          <constructor-arg value="24" index="1"/> 
          <constructor-arg value="alok@gmail.com" index="2"/> 
       </bean>
    

    【讨论】:

    • 为什么更喜欢索引?我认为您关于构造函数定义的第一条评论将解决它。
    • @Rohit 是的,当然!!如果没有定义适当的构造函数,就无法解决。但是在定义构造函数之后,正如 Spring 建议的那样,为了消除歧义,最好也定义索引。 Spring doc 说:“提示:为简单参数指定索引/类型/名称参数以避免类型歧义”
    猜你喜欢
    • 2011-02-02
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    • 2018-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多