Как сделать синглтон в CDI 1.2

Я использую сварку 2.3.5, которая поддерживает CDI 1.2. Я столкнулся с проблемой, что bean-компоненты CDI, аннотированные @javax.inject.Singleton, игнорируются контейнером (bean-discovery-mode="annotated").

После поиска в Google я все еще не могу найти информацию о синглтонах и CDI 1.2. Может ли кто-нибудь объяснить ситуацию и привести пример, как сделать одноэлементный компонент CDI с помощью CDI 1.2.


person Pavel_K    schedule 21.05.2017    source источник


Ответы (3)


В режиме обнаружения бинов annotated CDI будет собирать только бины, аннотированные с помощью так называемых аннотаций, определяющих бины. Спецификация четко определяет их и, как и следовало ожидать, , @Singleton среди них нет.

Чтобы сделать ваш синглтон узнаваемым, проще всего просто использовать режим обнаружения all, но я полагаю, вы хотите этого избежать. В этом случае, возможно, можно использовать расширение для регистрации аннотированного типа вашего синглтона — CDI сможет подобрать оттуда.

Опять же, использование CDI @Singleton очень ограничено/специфично, поскольку это псевдообласть без прокси. В большинстве случаев @ApplicationScoped в любом случае сделает именно то, что вам нужно, поэтому обязательно учитывайте это, прежде чем выполнять какие-либо дополнительные действия.

person Siliarus    schedule 22.05.2017
comment
Я лично родом из мира Spring, где по умолчанию используются как одноэлементная область, так и инъекция без прокси. Очень странно, что это не только не по умолчанию в CDI, но и очень сложно сделать. В моем случае @ApplicationScoped - это не то, что мне нужно, так как я не хочу прокси-инъекции (мне это не нужно, и это просто добавляет больше записей в стек для всей логики поиска компонентов). CDI необходимо добавить способ обнаружения аннотированных bean-компонентов, включая @Singleton. - person Frans; 07.04.2019
comment
Вы можете использовать @Singleton или фактическое значение по умолчанию @Dependent, оба из которых не имеют прокси. - person Siliarus; 08.04.2019
comment
Да, но bean-компоненты с @Singleton-аннотациями не обнаруживаются автоматически, если режим обнаружения установлен на аннотированный. Получение автоматически обнаруживаемых bean-компонентов без проксирования кажется невозможным в CDI. - person Frans; 03.06.2019
comment
Я бы по-прежнему рекомендовал вам использовать @ApplicationScoped, прокси спорный (если есть) накладные расходы. Если вы не выполняете магические трюки, которые потребуют от вас разворачивания прокси-сервера, у вас все будет хорошо. Помимо этого, вам нужно будет иметь расширение, которое либо программно зарегистрирует этот bean-компонент с желаемой областью действия, либо, возможно, изменит область действия существующей. Или, может быть, вы могли бы поиграть с методом производителя, создав этот компонент как синглтон, чтобы он тоже работал. Однако оба решения уступают простому использованию области приложения. - person Siliarus; 03.06.2019

Когда discovery-mode = annotated, Weld не идентифицирует bean-компоненты с @Singleton и поэтому не загружает их, потому что @Singleton не является обычной областью.

Если вы хотите иметь синглтон с CDI, используйте @ApplicationScoped

person Rouliboy    schedule 21.05.2017
comment
Когда вы вводите bean-компонент @ApplicationScoped, он внедряет прокси. Это может быть не то, что вы хотите. - person Frans; 07.04.2019

Хорошо, это старый вопрос, и, вероятно, мое решение приходит слишком поздно :)

Просто создайте такой стереотип:

@Stereotype
@Singleton
@Target( TYPE )
@Retention( RUNTIME )
@interface SingletonBean
{
}

... и используйте его так:

@SingletonBean
class MyBean
{
}

Таким образом, MyBean будет обнаружен, когда bean-discovery-mode="annotated"; без участия прокси.

person PA314159    schedule 18.10.2019