无论如何要锁定@Produces方法

时间:2013-10-25 17:18:35

标签: java-ee-6 cdi

我有一个带有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吗?

2 个答案:

答案 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;
    }
}