在初始化静态变量期间调用 Singleton EJB

Call Singleton EJB during initializing a static variable

我有一个线程安全的重资源,我想将其初始化为静态 class 变量。在初始化此对象期间,我需要从外部 属性 文件中读取一些 "connection" 参数。

要读取 init 参数,我想使用令人兴奋的 Configuration Singleton EJB,但似乎我注入的 configuration bean 在部署时为 null(当 EE 容器初始化我的静态变量时) .

这是我的配置 EJB:

@Startup
@Singleton
@LocalBean
public class Configuration {

    @Lock(LockType.READ)
    public String getValue(String key) {
        return ...;
    }
}

这是我想要初始化我的 HeavyObject 的方式:

@Stateless
public class SenderBean {

    private static HeavyObject something;

    @Inject
    private Configuration configuration;

    public SendNotificationBean()  {
        String host = configuration.getValue("....");
        String port= configuration.getValue("....");

        something = new HeavyObject(host, port);
    }
}

但是 configuration 为空:

Caused By: java.lang.NullPointerException
        at com.aaa.bbb.business.SenderBean.configureProxy(SenderBean.java:187)

也许我需要更改容器初始化 EJB-s 的顺序?

它不会工作,因为容器在注入任何东西之前调用默认构造函数。有一个注解@PostConstruct

为了解决这个问题,我还会制作 HeavyObject 一个单例 bean 并在其中注入 Configuration。类似于:

@Singleton
public class HeavyObject {

    @Inject
    private Configuration conf;

    @PostConstruct
    private void configure() {
        // make something with the conf
    }

}

并注入它:

@Stateless
public class SenderBean {

    @Inject
    private HeavyObject ho;
    ...
}

当然,这只是一种方法,但我建议避免在 bean 中使用静态内容,并仔细考虑 bean 的职责是什么。 这就是为什么我将 @PostConstruct 配置逻辑放在 HeavyObject 单例而不是 运行 上 SenderBean.

没有什么会阻碍你将 Configuration 注入 SenderBean,如果有的话。