在成员变量中使用时未实例化注入的 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);
}
}
我注入的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);
}
}