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

Java 在初始化静态变量期间调用Singleton EJB,java,jakarta-ee,static,ejb,Java,Jakarta Ee,Static,Ejb,我有一个线程安全的重资源,我想将其初始化为一个静态类变量。在初始化这个对象的过程中,我需要从外部属性文件中读取一些“连接”参数 要读取init参数,我想使用现有的Configurationsingletonejb,但在部署时(当EE容器初始化静态变量时),注入的Configurationbean似乎为null 这是我的配置EJB: @Startup @Singleton @LocalBean public class Configuration { @Lock(LockType.REA

我有一个线程安全的重资源,我想将其初始化为一个静态类变量。在初始化这个对象的过程中,我需要从外部属性文件中读取一些“连接”参数

要读取init参数,我想使用现有的
Configuration
singletonejb,但在部署时(当EE容器初始化静态变量时),注入的
Configuration
bean似乎为null

这是我的配置EJB:

@Startup
@Singleton
@LocalBean
public class Configuration {

    @Lock(LockType.READ)
    public String getValue(String key) {
        return ...;
    }
}
@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);
    }
}
这是我想初始化HeavyObject的方式:

@Startup
@Singleton
@LocalBean
public class Configuration {

    @Lock(LockType.READ)
    public String getValue(String key) {
        return ...;
    }
}
@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);
    }
}
但是
配置
为空:

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
singleton上,而不是在
SenderBean上运行它

如果使用了
配置
的话,也没有任何东西会妨碍您将
配置
注入
SenderBean