Как написать spring bean с конструктором, который содержит список?
У меня есть список:
ArrayList<DiameterMessageHandler> handlers = new ArrayList<>();
handlers.add(new AARHandler());
handlers.add(new CERHandler());
handlers.add(new PPAHandler());
handlers.add(new STRHandler());
handlers.add(new DWRHandler());
Мне интересно, как создать spring bean, который обрабатывает обработчики как один из его аргументов, т.е. возможно ли это сделать в applicationContext.xml. Должен ли я создать отдельный beans для списка и каждый из обработчиков (AARHandler и т.д.) сначала? Вот мой applicationContext.xml
<bean id="DiameterClient" class="com.rory.ptspsim.diameterclient.DiameterClient" scope="singleton" init-method="start">
<constructor-arg type="java.lang.String" index="0"><value>${pcca.host}</value></constructor-arg>
<constructor-arg index="1">WHAT GOES HERE?</constructor-arg>
</bean>
Ответы
Ответ 1
Возможно, вы хотите, чтобы все эти обработчики были Spring beans. Это конфигурация:
<bean id="DiameterClient" class="com.rory.ptspsim.diameterclient.DiameterClient" init-method="start">
<constructor-arg value="${pcca.host}" />
<constructor-arg>
<list>
<ref bean="aarHandler" />
...
</list>
</constructor-arg>
</bean>
<bean id="aarHandler" class="com.rory.ptspsim.diameterclient.AARHandler" />
Ответ 2
Я думаю, что наиболее подходящий способ сделать это:
<bean id="DiameterClient" class="com.rory.ptspsim.diameterclient.DiameterClient" scope="singleton" init-method="start">
<constructor-arg type="java.lang.String" index="0"><value>${pcca.host}</value></constructor-arg>
<constructor-arg index="1">
<list>
<ref bean="aarHandler" />
<ref bean="cerHandler" />
<ref bean="ppaHandler" />
<ref bean="strHandler" />
<ref bean="dwrHandler" />
</list>
</constructor>
</bean>
вы можете перейти по следующей ссылке http://springindepth.com/book/index.html
Ответ 3
Если вы хотите, чтобы все доступные обработчики, Spring также собирали их для вас через Autowiring:
public DiameterClient(@Autowired List<DiameterMessageHandler> handlers){
this.handlers = handlers;
}
Теперь Spring будет вводить список всех доступных обработчиков.
См. Spring Ссылка 4.9.2: @Autowired
Ответ 4
<bean id="DiameterClient" class="com.rory.ptspsim.diameterclient.DiameterClient" scope="singleton" init-method="start">
<constructor-arg type="java.lang.String" index="0"><value>${pcca.host}</value></constructor-arg>
<constructor-arg index="1">
<list>
<bean class="AARHandler"/>
<bean class="CERHandler"/>
</list>
</constructor-arg>
</bean>
Ответ 5
<list>
<ref bean="handler1" />
<ref bean="handler2" />
<ref bean="handler3" />
<ref bean="handler4" />
<ref bean="handler5" />
</list>
<bean id="handler1" class="AARHandler"/>
<bean id="handler2" class="CERHandler"/>
<bean id="handler3" class="PPAHandler"/>
<bean id="handler4" class="STRHandler"/>
<bean id="handler5" class="DWRHandler"/>