我有一个场景,在这样的抽象类的构造函数中调用autowired为null:
public abstract class AbstractClass{
@Autowired
@Qualifier("proId")
protected Prop prop;
public AbstractClass(){
prop.getName();
上面在部署时抛出NullException。
但是,在实例化
之后调用autowired属性时,以下内容有效public abstract class AbstractClass{
@Autowired
@Qualifier("proId")
protected Prop prop;
public void Init(){
prop.getName();
}
}
public class DefaultClass extends AbstractClass(){
...
@autowired
DefaultClass dc ;
...
dc.Init();
我怎样才能让第一个案例起作用?
答案 0 :(得分:6)
你做不到。注入只能在创建对象之后(或在构造函数注入的构造期间)发生。换句话说,当在抽象类构造函数中调用prop.getName()
时,该字段仍为null
,因为Spring尚未处理它。
考虑重构代码,以便抽象类具有接受Prop
参数并使用构造函数注入的构造函数
public AbstractClass(Prop prop) {
this.prop = prop;
prop.getName();
}
...
@Autowired
public DefaultClass(Prop prop) {
super(prop);
}
答案 1 :(得分:1)
您是否了解Java中的对象创建生命周期? 春天对此没有任何魔力。
使用Spring创建bean时有多个阶段
请记住,在构造函数之前没有bean的实例,所以Spring无法在其中连接任何内容!