【问题标题】:Injecting bean into default constructor将bean注入默认构造函数
【发布时间】:2013-07-03 05:46:37
【问题描述】:

假设我有这样的课程:

public class A {

 private B b;

 public A() {

 }

 // Some code calling methods in b.
}

如何通过 XML 配置将 B 的实例注入 A 而不在 Spring 中添加参数化构造函数?

我可以同时拥有参数化构造函数和设置器吗?

 public class A {

     private B b;

     public A(B b) {
        this.b = b;
     }

     public void setB(B b) {
         this.b = b;
     }
     // Some code calling methods in b.
    }

编辑:感谢所有答案。我的实际问题是我有这样的课程:

公开课 A {

 private B b;

 public A(B b) {
    this.b = b;
 }
 // Some code calling methods in b.
}

并且出于向后兼容性的原因,我希望为上述类提供一个默认构造函数,而无需删除参数化构造函数。

所以,

  1. 当我添加一个 bean 时,bean 是否会自动注入到默认构造函数中?或者我应该在 XML 文件中添加其他配置以将其注入其中?
  2. 如果我添加一个 setter,我应该在 XML 中进行哪些额外的配置更改以及如何更改?

假设我有一个如下的 xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
                           http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="name"
          class="A">
        <constructor-arg ref="B" />
    </bean>

</beans>

【问题讨论】:

    标签: java spring


    【解决方案1】:

    您可以通过Setter Injection 进行操作。为此,您需要为您的成员字段 b 添加一个 setter 方法

    我可以同时拥有参数化构造函数和设置器吗?

    是的,你可以拥有。

    如果参数化构造函数是 bean 中的唯一构造函数,那么你应该使用 构造函数注入。

    else 为您的类创建 非参数默认构造函数(连同参数化构造函数)并使用 setter 或构造函数注入。

    【讨论】:

      【解决方案2】:

      如果不允许我们改变这个类那就没办法了,否则我们可以使用Spring的Autowired注解

      public class A {
         @Autowired
         private B b
         ...
      

      【讨论】:

        【解决方案3】:

        你可以通过&lt;constructor-arg&gt;标签将bean类B id传递给类A(例如beans.xml)

        <bean id="a" class="ClassA">
            <constructor-arg ref="beanB"/>
        </bean>
        <bean id="beanB" class="com.tutorialspoint.SpellChecker">
           </bean>
        

        以下网址可能在这方面对您有很大帮助

        http://www.tutorialspoint.com/spring/constructor_based_dependency_injection.htm [编辑]

        【讨论】:

          【解决方案4】:

          B 对象在构造函数中不可用。最好的选择是注入它并使用@PostConstruct 方法来初始化bean。要注入 bean b,请使用 sanbhat 提到的 setter 注入。或者,您也可以使用 annotation-based configuration 并简单地将 @Inject@Autowired 注释添加到 B 字段并在 XML 配置中定义您的 bean B。

          public class A {
          
           @Inject
           private B b;
          
           @PostConstruct
           public init() {
              // inititalization code...
           }
          
           // Some code calling methods in b.
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-05-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-07-23
            相关资源
            最近更新 更多