как создать экземпляр более одного компонента CDI/Weld для одного класса?
-
22-09-2019 - |
Вопрос
В 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.