0

我有一个带有 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可以为此目的使用 a吗?

4

2 回答 2

1

另一种方法是Something在您的 post 构造中创建,然后简单地返回它。EJB 单例意味着每个应用程序只有一个实例

public class MyBean {
    private Something something;
    @PostConstruct
    public void createSomething() {
        this.something = new Something();
    }
    @Produces
    public Something getSomething() {
        return this.something;
    }
}
于 2013-10-25T22:05:40.663 回答
1

我想你真正想要的是:

@Produces @ApplicationScoped
public MySomething getSomething()  {
    // ....
}

由于您的生产者方法没有明确的范围,它默认为@Dependent范围,因此为每个注入点创建一个新的 bean 实例。这就是您收到多条日志消息的原因。

于 2013-10-25T17:45:33.620 回答