2013-10-25 4 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 сферу, поэтому новый экземпляр компоненты получает созданное для каждой точки инъекции. Вот почему вы получаете несколько сообщений журнала.

+0

Я считаю, что это то, что я хочу. Я попробую. – DarVar

1

Другой способ сделать это - создать Something в вашей конструкции сообщения и просто вернуть это. EJB Singletons предназначены для одного экземпляра за приложение.

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

Хорошая точка. Но разве вы не могли просто просто аннотировать поле? Почему дополнительный геттер? –

+0

Вы можете. Я всегда находил производителей методов чище для чтения. –

Смежные вопросы