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

时间:2019-08-12 13:37:38

标签: singleton cdi java-ee-6

我正在尝试将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上下文中添加单例框架的实例?

1 个答案:

答案 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,可根据您使用的版本随意浏览较旧的版本。 我不会为此编写代码,因为它很复杂而且很长,生产者应该为您解决问题。

另请参见