как создать экземпляр более одного компонента CDI/Weld для одного класса?

StackOverflow https://stackoverflow.com/questions/2318848

Вопрос

В Spring можно было создать экземпляр любого класса, определив соответствующий компонент в xml conf.Также можно было создать экземпляр более одного bean-компонента для одного и того же класса с разными параметрами.....

Есть ли такие возможности и в CDI, а именно, можно ли создавать разные экземпляры одного и того же класса с разными параметрами инициализации?

Можно ли также создать компонент без изменения класса... Я имею в виду без добавления аннотации?

ДОБАВЛЕН

Позвольте мне привести пример.

<bean id="someBean1" class="org.mm.MyBean">
    <property name="x" value="xx"/>
    <property name="y" value="yy"/>
    <property name="z" value="zz"/>       
</bean>
<bean id="someBean2" class="org.mm.MyBean">
    <property name="x" value="other value"/>
    <property name="y" value="yy2"/>
    <property name="z" value="zz2"/>       
</bean>

Как создать экземпляры двух экземпляров одного и того же класса и инициализировать их разными значениями полей?

Это было полезно?

Решение

Насколько я вижу, два варианта:

  • Без дополнительных знаний вашего варианта использования я предполагаю, что вы либо хотите предоставить какую-то альтернативную реализацию для (макетного) тестирования или проблем с настройкой (скажем, другого PaymentProvider для OrderService).Это поддерживается самой спецификацией, посмотрите @Alternative здесь (и не повторяйте мою первоначальную ошибку и не забудьте активировать альтернативы в beans.xml)

  • Чтобы получить XML-конфигурацию в стиле Spring, вы можете использовать Конфигурация шва 3, который обеспечивает XML-конфигурацию, как описано.Кстати, это было частью JSR 299, но по какой-то причине было удалено из спецификации.

Другие советы

есть несколько способов сделать это.

Например.используйте @New

частный @Inject @New YourBean yb;частный @Inject @New YourBean yb2;

Это заставляет контейнер создавать новый экземпляр независимо от того, какую область действия изначально имел компонент.

Другой способ - просто определить YourBean как @Dependent с ограниченной областью действия (что, кстати, (в настоящее время) является значением по умолчанию, если класс вообще не аннотирован).

Вы можете легко использовать методы-производители, и если у вас есть несколько экземпляров, которые должны быть созданы методом, используйте квалификаторы CDI, чтобы различать разные типы экземпляров.

Также вы можете использовать Seam Config, чтобы сделать это Spring, но я думаю, что методы производителя — более элегантный способ сделать это.в зависимости от вашего варианта использования есть еще один вариант — @Alternative.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top