如何使用包含列表的构造函数编写spring bean?

Ror*_*ory 22 java spring web.xml spring-mvc

我有一个列表如下:

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());
Run Code Online (Sandbox Code Playgroud)

我想知道如何创建一个将处理程序作为其参数之一的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>
Run Code Online (Sandbox Code Playgroud)

sin*_*pop 37

可能你想要所有这些处理程序也是Spring bean.这是配置:

<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" />
Run Code Online (Sandbox Code Playgroud)


r36*_*66y 7

我认为最合适的方法是:

<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>
Run Code Online (Sandbox Code Playgroud)

您可以访问以下链接http://springindepth.com/book/index.html


Sea*_*oyd 7

如果您想要所有可用的处理程序,Spring还将通过自动装配为您收集它们:

public DiameterClient(@Autowired List<DiameterMessageHandler> handlers){
    this.handlers = handlers;
}
Run Code Online (Sandbox Code Playgroud)

现在Spring将注入所有可用处理程序的列表.

参见Spring Reference 4.9.2:@Autowired