如何编写一个包含列表的构造函数的Spring Bean?

24
我有一个如下的列表:
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中进行此操作 - 我是否必须首先为列表和每个处理程序(例如AARHandler)创建单独的Bean?以下是我的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>
5个回答

43

也许你想要这些处理程序也成为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" />

1
这是前五个中最好的答案。 :-) - Donal Fellows

8
我认为最适合的方式是:
<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>

注意:链接将我带到了一些rep.playzonenow.com网站,上面有一个检查优惠的按钮 - 不要进入该链接。 - bonapart3
已删除涉嫌问题链接。 - r366y

7
如果您想要所有可用的处理程序,Spring也可以通过自动装配为您收集它们:
public DiameterClient(@Autowired List<DiameterMessageHandler> handlers){
    this.handlers = handlers;
}

现在Spring将注入所有可用处理器的列表。
参见Spring参考文档4.9.2:@Autowired

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>
       <bean class="AARHandler"/>
       <bean class="CERHandler"/>
      </list>
    </constructor-arg>        
</bean>

1
    <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"/>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接