2013-08-19 5 views
17

Я переношу приложение в Java EE 7 и хотел бы CDI 1.1. Но я не понимаю значение bean-discovery-mode="annotated". CDI 1.1 specification не очень помогает. По крайней мере, я не нашел полезного абзаца. Я пропустил это?Значение режима обнаружения боба, аннотированного в CDI 1.1

Этот пример прекрасно работает с bean-discovery-mode="all" и впрыскивает экземпляр LoggingClass:

public class LoggingClass { 
    public Logger logger = Logger.getLogger("ALOGGER"); 

} 

@Test 
public class MMLoggerProducerIT extends Arquillian { 

    @Inject private LoggingClass lc; 

} 

Но если я изменю из bean-discovery-mode="all" в bean-discovery-mode="annotated" контейнер не может вводить экземпляр в поле lc.

Как мне добавить аннотацию LoggingClass к правильному использованию bean-discovery-mode="annotated"?

+0

Я только угадываю, но я думаю, что «@Named» или «@ManagedBean» были кандидатами? –

+1

@Mike_Braun Named будет выставлять только компонент в контексте EL, но не даст ему возможности. ManagedBean - это аннотация JSF, движок CDI игнорирует его. – Yuri

ответ

27

В качестве практического вопроса bean-discovery-mode="ALL" включает сканирование всех классов в архиве. Это называется «явным архивом».

Опуская beans.xml, или установка bean-discovery-mode="ANNOTATED", делает архив неявным архивом. В этом случае контейнер будет сканировать бобы с аннотированными типами областей.

Это объясняет, почему LoggingClass не вводится, если вы установили bean-discovery-mode="ANNOTATED". Как описано в учебном пособии Java EE 7:

CDI может управлять и вводить bean-объекты, аннотированные с типом области видимости в неявном архиве.

Редактировать: так, чтобы быть абсолютно четкими, вам необходимо добавить тип области действия в LoggingClass. Так что-то вроде этого:

@SessionScoped 
public class LoggingClass { 
    public Logger logger = Logger.getLogger("ALOGGER"); 
} 

В Java EE 7 и CDI 1.1, мы удалили требование включить дескриптор beans.xml развертывания для включения CDI для архива, в результате чего CDI 1.1 в соответствии с большинством других интерфейсов API Java EE где дескрипторы развертывания являются необязательными. Он также удалил двоичный характер включения/выключения, включая beans.xml или нет. Вы можете контролировать, какие файлы сканируются контейнером с настройками в bean-discovery-mode.

Обратитесь к руководству JavaEE на упаковку CDI приложений здесь: http://docs.oracle.com/javaee/7/tutorial/cdi-adv001.htm#CACDCFDE

+0

Если «beans.xml» не существует, как регистрируются и заказываются перехватчики и декораторы? Есть ли способ? – noinstance

+1

@nosuchnick Перехватчики могут быть заказаны через аннотации с использованием '@ Interceptors' и' @ Priority', как описано [в разделе 54.2.5 здесь] (http://docs.oracle.com/javaee/7/tutorial/doc/interceptors002 .htm # GKHNI). –

+0

описывает, как заставить @Produces работать? Есть ли аннотация, которую я должен внести в класс Factory? –

23

При использовании bean-discovery-mode="annotated" только классов с бобом, определяющей аннотациейare discovered. Все остальные классы игнорируются. Любой тип области видимости - это аннотация. Если тип области объявлен в классе bean, то, как говорят, класс bean-компонента имеет аннотацию, определяющую bean-компонент, [spec]. Спецификация 1.1 здесь не совсем понятна. Обнаружены только классы с областью @NormalScope или @Dependent, @javax.inject.Singleton и все остальные @Scope (псевдо) области are ignored.

Обратите внимание, что определение «аннотации, определяющей компонент», изменено в CDI 1.2 и теперь очень хорошо определен:

Набора фасоль, определяющая аннотация содержит:

  • @ApplicationScoped, @SessionScoped, @ConversationScoped и @RequestScoped аннотаций,
  • всех других нормальных типов сферы применения,
  • @Interceptor и @Decorator аннотаций,
  • все стереотипных аннотация (т.е. аннотация аннотированной с @Stereotype), и @Dependent масштабов аннотаций.
+1

Это должен быть принятый ответ. – Chris