2013-10-25 84 views
0

我有一个生产者方法的Singleton EJB。无论如何锁定@Produces方法

@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."在日志中多次东西,然后抛出一个java.lang.StackOverflowError

所以看起来像我需要锁定这个@Produces方法。

为此可以使用java.util.concurrent.Semaphore吗?

回答

1

我猜你真正想要的是这样的:

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

因为你的生产方法并没有一个明确的范围,则默认为@Dependent范围,所以一个新的bean实例获取每注射点创建。这就是为什么你会收到多条日志消息。

+0

我相信这是我想要的。我会试一试。 – DarVar

1

另一种方法是在你的文章构造中创建Something,并简单地返回它。 EJB单身人士意味着每个应用程序的单个实例

public class MyBean { 
    private Something something; 
    @PostConstruct 
    public void createSomething() { 
     this.something = new Something(); 
    } 
    @Produces 
    public Something getSomething() { 
     return this.something; 
    } 
} 
+0

好点。但是,难道你不能直接注释该字段吗?为什么额外的吸气剂? –

+0

你可以。我总是发现方法生产者更清晰可读。 –