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

Hey*_*nge 1 java cdi hazelcast jakarta-ee

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

@ApplicationScoped
public class Producer {

    private HazelcastInstance instance;

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

    @Produces
    public HazelcastInstance getInstance() {
        return instance;
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑

这个解决方案:

  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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Sil*_*rus 6

您的Producerbean 将是应用程序范围的,这一点很清楚。但是,HazelnutInstancebean 将是@Dependent.

因此,如果您在代码中的某处执行@Inject HazelnutInstance此操作,则会从 CDI 的角度注入一个依赖实例。

但是你总是返回同一个实例,永远不会在你的生产者中创建新对象,所以理论上,你正在共享一个实例。

但是,请注意 bean 生命周期!@Dependent当注入它们的 bean 被销毁时,bean 将被销毁。所以现在假设涉及到这种破坏尝试 - Weld 将尝试破坏您的依赖 bean 并将调用@PreDestroy(在“经典”bean 上)或@Disposes(在带有生产者的 bean 上)方法。

因此,在您的情况下,如果某处有处理的disposer 方法,则HazelcastInstance可能会导致麻烦,因为每次 Weld 尝试销毁/处理该依赖 bean 时都会调用它。

IMO 如果您将HazelcastInstance应用程序限定为范围,您会更好。例如

@Produces
@ApplicationScoped
public HazelcastInstance getInstance() {
   return instance;
}
Run Code Online (Sandbox Code Playgroud)