Spring Injection - 访问构造函数中的注入对象

时间:2010-11-09 14:05:02

标签: java spring dependency-injection

我有一个资源(Spring bean),它的一些字段由Spring注入,例如:

@Repository(value="appDao")
public class AppDaoImpl implements AppDao {
   @PersistenceContext
   EntityManager entityManager;

   public Resource() {
      ... use entityManager ... // doesn't work
   }
}

我知道我无法在构造函数中访问注入的entityManager,并且应该在不同的方法上使用@PostConstruct注释。但是这有什么原因呢?

2 个答案:

答案 0 :(得分:14)

因为Spring在创建对象之前无法访问任何字段或方法(这是通过构造函数完成的)。所以Spring使用构造函数实例化对象,然后注入属性。

唯一的解决方法是使用Constructor Injection(如果你有多个依赖项,这可能会很麻烦)。我认为您应该做的是使用the @PostConstruct annotation将代码移出构造函数并转换为初始化方法:

@PostConstruct
public void init(){
    // do stuff with entitymanager here
}

答案 1 :(得分:4)

原因在于bean的生命周期:

  • 容器(spring应用程序上下文)实例化对象
  • 然后它设置所有依赖项(包括示例中的entityManager)
  • 在设置了所有依赖项之后,它会调用@PostConstruct方法(如果有的话)。

Spring(并且没有人)可以在实际构造该对象之前将字段设置为对象。

可以使用构造函数注入 - 将依赖项传递给非默认构造函数,但@PersistenceContext无法实现