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



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

要读取 init 参数,我想使用我的单例 EJBConfiguration,但似乎我注入的configurationbean 在部署时为空(当 EE 容器初始化我的静态变量时(。

这是我的配置 EJB:

@Startup
@Singleton
@LocalBean
public class Configuration {
@Lock(LockType.READ)
public String getValue(String key) {
return ...;
}
}

这就是我想初始化我的 Heavy Object 的方式:

@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一个单例豆子,并在其中注入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上运行它的原因。

没有什么能阻止你注入ConfigurationSenderBean如果有的话。