Значение режима обнаружения bean, аннотированного в CDI 1.1
Я переношу приложение в Java EE 7 и хотел бы CDI 1.1. Но я не понимаю значения bean-discovery-mode="annotated"
.
Спецификация 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"
?
Ответы
Ответ 1
Как практический вопрос, bean-discovery-mode="ALL"
включает сканирование всех классов в архиве. Это называется "явным архивом".
Опускание beans.xml
или установка bean-discovery-mode="ANNOTATED"
делает архив неявным архивом. В этом случае контейнер будет сканировать beans с аннотированными типами областей.
Это объясняет, почему LoggingClass
не вводится, когда вы устанавливаете bean-discovery-mode="ANNOTATED"
. Как описано в учебнике Java EE 7:
CDI может управлять и вводить beans, аннотированный типом области видимости в неявном архиве.
Изменить: просто для того, чтобы быть абсолютно ясным, вам нужно добавить тип области действия в 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
Ответ 2
При использовании bean-discovery-mode="annotated"
обнаруживаются только классы с bean определяющей аннотацией . Все остальные классы игнорируются. Любой тип области видимости - это аннотация bean. Если тип области объявлен в классе bean, то класс bean имеет bean определяющую аннотацию [spec]. Спецификация 1.1 здесь не совсем понятна. Открываются только классы с областью @NormalScope
или @Dependent
псевдообласти, @javax.inject.Singleton
и все остальные @Scope
(псевдо) области игнорируются.
Обратите внимание, что определение "аннотации определения" bean "изменено в CDI 1.2 и теперь очень четко определено:
Набор аннотаций bean содержит:
- @ApplicationScoped, @SessionScoped, @ConversationScoped и @RequestScoped аннотации,
- все другие обычные типы областей видимости,
- аннотации @Interceptor и @Decorator,
- все аннотации стереотипов (т.е. аннотации, аннотированные с помощью @Stereotype), и аннотацию области @Dependent.