Подтвердить что ты не робот

Значение режима обнаружения 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"?

4b9b3361

Ответ 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.