我有线程安全的大量资源,我想将其初始化为静态类变量。在初始化此对象期间,我需要从外部属性文件中读取一些“连接”参数。
要读取init参数,我想使用激发的Configuration
Singleton EJB,但是在部署时(当EE容器初始化我的静态变量时)注入的configuration
bean似乎为空。 / p>
这是我的配置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的顺序?
答案 0 :(得分:2)
它将不起作用,因为容器在注入任何东西之前会调用默认构造函数。有一个注释@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
。