2015-06-12 1 views
5

Учитывая две фасоли аннотированной с @Startup:Является ли @DependsOn необходимым для другого бина CDI, который вводится?

@Singleton  
@Startup 
@DependsOn("B") 
public A { 
    @Inject 
    private B b; 
} 

@Singleton  
@Startup 
public B {} 

ли @DependsOn в этой необходимой ситуации, чтобы обеспечить, что B инициализируется до A? Или существует какая-то условная конфигурация, которая в такой ситуации порядок инъекций определяет порядок инициализации?

Официальный учебник не охватывает этот случай, но только бобы, которые просто семантически покрыты без синтаксической/проводной связи через @Inject.

ответ

1

Если bean A на самом деле зависит от инициализации bean B, то вам это нужно.

С @Startup вы делаете нетерпеливое мгновение - синглтон создается во время запуска, независимо от того, используется он или нет.

В ленивом экземпляре синглтон не создается, пока его метод не нужен.

В обоих случаях контейнер может инициализировать фасоль в любом порядке он хочет:

Иногда несколько одноточечно сессионные компоненты используются для инициализации данных для приложения и, следовательно, должны быть инициализированы в определенном порядке. В этих случаях используйте аннотацию javax.ejb.DependsOn для объявления зависимостей запуска однопользовательского сеансового компонента.

1

Да, это необходимо.

Иначе ничего не гарантирует, что B будет инициализирован до A.

Согласно JavaEE 6 documentation:

Иногда несколько одноточечно сессионные компоненты используются для инициализации данных для приложения и, следовательно, должны быть инициализированы в определенном порядке. В этих случаях используйте аннотацию javax.ejb.DependsOn для объявления зависимостей запуска однопользовательского сеансового компонента. Атрибут значения аннотации @DependsOn - это одна или несколько строк, которые определяют имя целевого одноэлементного сеансового компонента. Если в @DependsOn указано более одного зависимого одноэлементного компонента, порядок, в котором они перечислены, необязательно является порядком, в котором контейнер EJB инициализирует целевые одноэлементные сеансовые компоненты.

Пример:

Следующая одноэлементный сессионный компонент, PrimaryBean, должен быть запущен первый:

@Singleton 
public class PrimaryBean { ... } 

SecondaryBean зависит от PrimaryBean:

@Singleton 
@DependsOn("PrimaryBean") 
public class SecondaryBean { ... } 

Это гарантирует, что EJB контейнер инициализирует PrimaryBean до SecondaryBean.

+0

Это всегда беспокоило меня, если мне действительно нужна аннотация @DependsOn. Потому что, если SecondaryBean нуждается в PrimaryBean, это, вероятно, означает, что PB вводится в SB и используется где-то, чтобы гарантировать, что PB будет инициализирован, прежде чем я буду использовать его в SB.Есть ли реальный случай, когда SB зависит от PB, но не использует его? – rychu

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