在下面的代码中,Hazelcast 实例将是应用程序范围内的说法是真的吗?
@ApplicationScoped
public class Producer {
private HazelcastInstance instance;
@PostConstruct
public void afterCreate() {
instance = Hazelcast.newHazelcastInstance();
}
@Produces
public HazelcastInstance getInstance() {
return instance;
}
}
编辑
这个解决方案:
- 确保生成的内容在应用程序范围内。
- 提供优雅的 Hazelcast 关闭。
@ApplicationScoped
public class Producer {
private HazelcastInstance instance;
private Producer() {}
@PostConstruct
public void afterCreate() {
instance = Hazelcast.newHazelcastInstance();
}
@PreDestroy
public void beforeDestroy() {
if(instance != null) {
instance.shutdown();
}
}
@Produces
@ApplicationScoped
public HazelcastInstance getInstance() {
return instance;
}
}
最佳答案
您的 Producer
bean 将在应用程序范围内,这一点很清楚。
但是,HazelnutInstance
bean 将是@Dependent
。
因此,如果您在代码中的某处执行@Inject HazelnutInstance
,它将从 CDI 角度注入(inject)一个依赖实例。
但是您总是返回同一个实例,永远不会在您的生产者中创建新对象,所以理论上,您正在共享那个实例。
但是,请注意 bean 的生命周期! @Dependent
bean 将在注入(inject)它们的 bean 被销毁时被销毁。所以现在假设它涉及到这种破坏尝试 - Weld 将尝试破坏您的依赖 bean 并将调用 @PreDestroy
(在“经典”bean 上)或 @Disposes
(在 bean 上与生产者)方法。
因此,在您的情况下,如果有 disposer method在处理 HazelcastInstance
的某个地方,这可能会导致麻烦,因为每次 Weld 尝试销毁/处置该依赖 bean 时都会调用它。
在我看来,如果您将 HazelcastInstance
设为应用程序作用域,您会过得更好。例如
@Produces
@ApplicationScoped
public HazelcastInstance getInstance() {
return instance;
}
关于java - 使用生产者创建应用程序范围的类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46559523/