是否可以将单例框架的实例添加到 CDI 上下文中?



我正在尝试将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 上下文中?

有两种方法,第一种是简单的一种是制作人。这是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().这是CDI 2.0规范的链接,请根据您所在的版本随意浏览旧版本。 我不会为此编写代码,因为它相当复杂和冗长,制作人应该为您解决问题。

参见

  • 请解释CDI中的@Produces注释

最新更新