假设我有一个这样的课程:
public class A {
private B b;
public A() {
}
// Some code calling methods in b.
}
如何在不通过Spring添加参数化构造函数的情况下,通过XML配置将B实例注入A?
我可以同时使用参数化构造函数和setter吗?
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.
}
我希望有一个上述类的默认构造函数,而不会为了向后兼容性而删除参数化构造函数。
所以,
考虑我有一个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>
答案 0 :(得分:1)
您可以通过Setter Injection完成此操作。为此,您需要为成员字段b
我可以同时使用参数化构造函数和setter吗?
是的,你可以拥有。
如果参数化构造函数是bean中的唯一构造函数,那么你应该使用 构造函数注入。
为您的类创建非参数默认构造函数(以及参数化构造函数),并使用setter OR构造函数注入。
答案 1 :(得分:0)
如果我们不允许更改此类,则无法使用,否则我们可以使用Spring的Autowired注释
public class A {
@Autowired
private B b
...
答案 2 :(得分:0)
B对象在构造函数中不可用。最好的选择是注入它并使用@PostConstruct
方法初始化bean。要注入bean b
,请使用sanbhat提到的setter注入。或者,您也可以使用annotation-based configuration,只需在B字段中添加@Inject
或@Autowired
注释,并在XML配置中定义bean B.
public class A {
@Inject
private B b;
@PostConstruct
public init() {
// inititalization code...
}
// Some code calling methods in b.
}
答案 3 :(得分:0)
您可以通过<constructor-arg>
标记将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 [编辑]