【问题标题】:Is it possible to add an instance of singleton framework to CDI context?是否可以将单例框架的实例添加到 CDI 上下文?
【发布时间】:2019-12-19 02:20:46
【问题描述】:

我正在尝试将 StarMX 框架 (https://github.com/rogeriogentil/starmx) 集成到旧版 Web 应用程序中。该框架使用 JMX 技术并使用单例模式进行初始化:StarMXFramework.createInstance()。 Web 应用程序使用 Java EE 6 技术,例如 EJB 和 CDI(也称为 DeltaSpike)。但是,初始化框架的方式(下面的代码)不会将其实例添加到 CDI 上下文中。

import org.starmx.StarMXException;
import org.starmx.StarMXFramework;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.Singleton;
import javax.ejb.Startup;

@Startup
@Singleton
public class StarMXSingleton {

    private StarMXFramework starMX;

    @PostConstruct
    public void postConstruct() {
        try {
            starMX = StarMXFramework.createInstance();
        } catch (StarMXException e) {
            (...)
        }
    }

    @PreDestroy
    public void preDestroy() {
        if (starMX != null) {
            try {
                starMX.shutdown();
            } catch (StarMXException e) {
                (...)
            }
        }
    }
}

我知道可以扩展 CDI,但是是否可以将单例框架的实例添加到 CDI 上下文中?

【问题讨论】:

标签: singleton cdi java-ee-6


【解决方案1】:

有两种方法,第一种,简单的一种是制作人。这是一个link,了解 CDI 生产者是什么以及他们是如何工作的。简而言之,CDI 将使用这个生产者来创建一个 bean 的实例,其类型由生产者方法的返回类型决定。 生产者方法必须放在 CDI bean 中,这样它才能被 CDI 拾取。请注意,生产者的范围会影响调用它的频率,就像使用标准 bean 一样。下面是它的样子:

@ApplicationScoped
public class SomeCdiBeanInYourApplication {

  @Produces //denotes producer method
  @ApplicationScoped // scope of produced bean, use CDI scope (the singleton you have is EJB annotation)
  public StarMXFramework produceMxFramework() {
    return StarMXFramework.createInstance();
  }
  
}

第二种方法是 CDI 扩展,即 AfterBeanDiscovery 事件的生命周期观察者,您可以在其中 addBean()。这是link to CDI 2.0 spec,请根据您使用的版本随意浏览旧版本。 我不会为此编写代码,因为它相当复杂且冗长,制作人应该为您完成。

另见

【讨论】:

  • 感谢@Siliarus 的出色解释,但我认为我没有很好地澄清这个问题。 StarMX 是一个框架,在您启动后会一直运行。与大多数常见的实现不同,我不会使用@Inject StarMXFramework starmx; 之类的东西来获取生成的对象。我需要在 CDI 上下文中获取(或放置)另一个类。现在,我不知道最好是编辑这个问题还是创建其他问题来更好地解释它。
  • 可能再做一个。但是您不能在 CDI 中真正“将类放入上下文”,这是通过创建 bean 来完成的,此时只要上下文存在,上下文实例就会存储在上下文中。我想问题是,为什么首先需要在上下文中拥有该对象?
  • StarMX 支持通过 XML 文件基于事件或计时器定义操作。因此,当发送(触发)JMX 通知时,StarMX 可以捕获它,调用一个类并处理该类的方法。但是,StarMX 不会在使用 CDI(使用 DeltaSpike)的项目中捕获 JMX 通知。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多