我有一个资源(Spring bean),它的一些字段由Spring注入,例如:
@Repository(value="appDao")
public class AppDaoImpl implements AppDao {
@PersistenceContext
EntityManager entityManager;
public Resource() {
... use entityManager ... // doesn't work
}
}
我知道我无法在构造函数中访问注入的entityManager,并且应该在不同的方法上使用@PostConstruct
注释。但是这有什么原因呢?
答案 0 :(得分:14)
因为Spring在创建对象之前无法访问任何字段或方法(这是通过构造函数完成的)。所以Spring使用构造函数实例化对象,然后注入属性。
唯一的解决方法是使用Constructor Injection(如果你有多个依赖项,这可能会很麻烦)。我认为您应该做的是使用the @PostConstruct
annotation将代码移出构造函数并转换为初始化方法:
@PostConstruct
public void init(){
// do stuff with entitymanager here
}
答案 1 :(得分:4)
原因在于bean的生命周期:
@PostConstruct
方法(如果有的话)。Spring(并且没有人)可以在实际构造该对象之前将字段设置为对象。
你可以使用构造函数注入 - 将依赖项传递给非默认构造函数,但@PersistenceContext
无法实现