Spring在Abstract类构造函数中自动装配

时间:2014-02-24 03:45:10

标签: java spring constructor autowired

我有一个场景,在这样的抽象类的构造函数中调用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(); 

我怎样才能让第一个案例起作用?

2 个答案:

答案 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时有多个阶段

  1. 使用构造函数
  2. 实例化对象
  3. 依赖项被注入到bean中(显然除了在第一阶段通过对象传递的构造函数依赖项)
  4. 调用对象@PostConstruct(或InitializingBean)方法。
  5. 请记住,在构造函数之前没有bean的实例,所以Spring无法在其中连接任何内容!