Spring Bean Init Order

时间:2011-12-06 17:14:44

标签: java spring

我有两个Spring Beans如下:

@Service
public class A{
}

@Service
public class B{
   @Autowired A a;

   public B(){
      a.doSomething();
   }

问题在于,不能保证A将早于B初始化。所以我将在B()中得到NullPointerException。

无论如何,我可以在Spring中指定这种依赖吗?

2 个答案:

答案 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)。