在成员变量中使用时未实例化注入的 Bean

Injected Bean not instantiated when used in member variable

我注入的EntityManager在成员变量中使用时没有启动。当我在方法中使用它时,它会被启动。

这个问题一般与注入bean的实例化时间有关吗?还是仅仅因为我使用的是 quarkus 和 hibernate?

    @Inject
    EntityManager entityManager;

    private StudentFacade studentFacade = new StudentFacade(entityManager); //entityManager is null

应该初始化变量 "entityManager",但它有一个空值。

问题是 studentFacade 是在构建持有 entityManage 的任何对象时初始化的,但是无论您用于 DI 的任何框架 - 仅在对象构建后注入 entityManager

因此在 studentFacade 字段初始化时 - entityManager 仍然为空。

要解决此问题,您可以将 studentFacade 变量的初始化延迟到注入之后。通常它是通过使用一些 life-cycle 钩子来完成的,比如:

@PostConstruct
public void onConstruct() {
    studentFacade = new StudentFacade(entityManager);
}

为 Spring 框架提供了示例,但我想几乎相同的规则适用于您使用的任何内容。

Quarkus 还支持构造函数注入,所以你也可以这样做:

@Singleton
public class MyBean {

   final StudentFacade studentFacade;

   public MyBean(EntityManager entityManager) {
      this.studentFacade = new StudentFacade(entityManager);
   }

}