我有一个带有Producer方法的Singleton EJB。
@javax.ejb.Singleton
public class MyBean{
private Something something;
@Produces
public MySomething getSomething() {
if(null == something){
LOG.info("Initializing MySomething.");
something = new Something();
}
return something;
}
}
我认为这会锁定,但我在日志中多次看到此"Initializing MySomething."
,然后Something会抛出java.lang.StackOverflowError
。
所以看起来我需要锁定这个@Produces
方法。
为此目的可以使用java.util.concurrent.Semaphore
吗?
答案 0 :(得分:1)
我想你真正想要的是:
@Produces @ApplicationScoped
public MySomething getSomething() {
// ....
}
由于您的生成器方法没有显式范围,因此默认为@Dependent
范围,因此会为每个注入点创建一个新的bean实例。这就是你收到多条日志消息的原因。
答案 1 :(得分:1)
另一种方法是在帖子构造中创建Something
,然后返回它。 EJB单例是每个应用程序的单个实例
public class MyBean {
private Something something;
@PostConstruct
public void createSomething() {
this.something = new Something();
}
@Produces
public Something getSomething() {
return this.something;
}
}