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

Joh*_*nak 7 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
   }
}
Run Code Online (Sandbox Code Playgroud)

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

Sea*_*oyd 14

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

解决这个问题的唯一方法是使用构造函数注入(如果您有多个依赖项,这可能很麻烦).我认为你应该做的是移动你的代码出了构造并进入使用初始化方法@PostConstruct注释:

@PostConstruct
public void init(){
    // do stuff with entitymanager here
}
Run Code Online (Sandbox Code Playgroud)


Boz*_*zho 5

原因在于bean的生命周期:

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

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

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

  • 这是不可能的:`@Target({TYPE, METHOD, FIELD})` (4认同)