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

весной можно было создать экземпляр любого класса, определив соответствующий компонент в 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 ответов


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

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

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


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

Е. Г. использовать @новый

private @Inject @New YourBean yb; private @Inject @New YourBean yb2;

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

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


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

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