Как создать более одного компонента CDI / Weld для одного класса? - PullRequest
6 голосов
/ 23 февраля 2010

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

Имеются ли такие функции и в 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>

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

Ответы [ 3 ]

4 голосов
/ 04 апреля 2011

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

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

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

2 голосов
/ 22 мая 2012

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

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

2 голосов
/ 26 февраля 2010

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

например. использовать @ New

private @Inject @New YourBean yb; личное @Inject @New YourBean yb2;

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

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

...