我正在尝试将StarMX框架(https://github.com/rogeriogentil/starmx)集成到旧版Web应用程序中。该框架使用JMX技术,并使用Singleton模式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上下文中添加单例框架的实例?
答案 0 :(得分:3)
有两种方法,第一种和一种简单的方法是生产者。 link这里是CDI生产者是什么以及它们如何工作的link to CDI 2.0 spec。简而言之,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()
。这是Please explain the @Produces annotation in CDI,可根据您使用的版本随意浏览较旧的版本。
我不会为此编写代码,因为它很复杂而且很长,生产者应该为您解决问题。