普通的自动注入失败的情况是:
1、在非spring管理的bean中使用@Autowired
2、@Autowired的类本身没有交给spring托管
但这次,我确认自己没有犯上述错误。
之前的代码由于比较复杂,经过简化后逻辑就是下面这样:
public class A{
@Autowired private B b;
A(){
b.invokeOneMethod();
}
}
通过断点进行检查,发现就是在调用b的方法时,b还未被注入。
这就导致了空指针异常。
java基础我们知道,类的初始化工作简单来说就是:
先初始化字段,再初始化构造函数。
但是,“初始化字段”这只是把字段都赋值为了0或者说null!!
因此,我在bean的注入工作没完成时就调用了该bean
解决方法:
public class A{
@Autowired private B b;
A(){
//b.invokeOneMethod();
}
@PostConstruct
private void init(){
b.invokeOneMethod();
}
}
在stackoverflow上有这样一道问题:
@PostConstruct与普通的构造函数有什么区别
别人的回答(仅摘要了其中一点):
because when the constructor is called, the bean is not yet initialized - i.e. no dependencies are injected. In the @PostConstruct method the bean is fully initialized and you can use the dependencies.
大意就是说,当构造函数被调用时,其实此时bean还是没有被初始化完成的状态。还没有依赖被注入。而@PostConstruct方法保证了bean的初始化工作全部完成后再被触发(调用)