我有两个Spring Beans如下:
@Service
public class A{
}
@Service
public class B{
@Autowired A a;
public B(){
a.doSomething();
}
问题在于,不能保证A将早于B初始化。所以我将在B()中得到NullPointerException。
无论如何,我可以在Spring中指定这种依赖吗?
答案 0 :(得分:6)
在构造bean之后,Spring框架中的任何自动装配都将发生。因此,无法使用构造函数本身的自动装配成员(如Autowired javadoc page中所示)。您可以选择将注释放在构造函数本身上,并使其接受另一个bean作为参数,然后才能工作:
@Service
public class B {
@Autowired
public B(A a) {
a.doSomething();
}
}
或者在单独的方法上使用@PostConstruct
注释,该方法将保证在构造bean之后执行并且所有引用都正确连接:
@Service
public class B{
@Autowired
A a;
@PostConstruct
public moreSetup() {
a.doSomething();
}
}
答案 1 :(得分:0)
Spring能够自动检测这些依赖项。它知道在B之前基于@Autowired
注释创建A(或者更正式地 - 当创建B的实例时,Spring检测到它需要A,并且如果它还没有实例化则将实例化A)。