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

标签 java jakarta-ee cdi hazelcast

在下面的代码中,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/

相关文章:

java - 通过 SSH 连接的 Ant SCP 任务

java - 依赖注入(inject)不起作用

jakarta-ee - CDI:异常,因为处置方法看不到生产方法

java - 使用 tomcat 7 容器配置 Weld 2.0 项目时出错

java - 如何在 Eclipse for Android 中将变量随机传递给 R.drawable?

java - 在不使应用程序崩溃的情况下抛出异常

java - 简单的 JavaEE HTML GET/POST 应用程序

java - 在 Internet Web 应用程序(j2ee 应用程序)和 Android 移动应用程序之间交换数据

java - @Inject 接口(interface)有两个实现

java - 填充多维数组时 IndexOutOfBounds 异常