Когда ваш @ApplicationScoped
Бин обнаружен, он не получает экземпляр сразу.
CDI
достаточно умен, чтобы инициализировать реальный объект, находящийся за сценой, только при необходимости.
Вы можете видеть, что получение ApplicationScoped
Бина через
final Instance<App> select = container.select(App.class);
final App app = select.get();
Действительно ли возвращает экземпляр прокси .
На данном этапе все еще нет App
Bean-компонента, привязанного к контексту приложения.
Теперь попробуйте взаимодействовать с этим объектом (даже просто вызвав toString
), и только после запустите событие.
Вы заметите, что он работает, потому что базовый объект был создан с помощью конструктора без аргументов.
Удаление Reception.IF_EXISTS
просто сигнализирует CDI
, что он должен немедленно создать и присоединить к контексту базовый экземпляр, чтобы он мог принимать входящие события независимо от того, что.
Такое поведение прокси задокументировано в спецификации (мне нужно найти страницу), и поэтому Бину требуется конструктор без аргументов.
Dependent
scope Бины не страдают от этой проблемы, поскольку они создаются каждый раз, когда это необходимо, с нуля и не отслеживаются платформой. Для одноэлементных, сеансовых или запрашиваемых объектов EJB требуется прокси-сервер для их правильного управления.
Dependent
scope Bean, вы можете видеть, что это "чистый" экземпляр