gpt4 book ai didi

java - 使用生产者创建应用程序范围的类成员

转载 作者:行者123 更新时间:2023-11-29 04:25:31 25 4
gpt4 key购买 nike

在下面的代码中,Hazelcast 实例将是应用程序范围内的说法是真的吗?

@ApplicationScoped
public class Producer {

private HazelcastInstance instance;

@PostConstruct
public void afterCreate() {
instance = Hazelcast.newHazelcastInstance();
}

@Produces
public HazelcastInstance getInstance() {
return instance;
}
}

编辑

这个解决方案:

  1. 确保生成的内容在应用程序范围内。
  2. 提供优雅的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com