2012-02-10 7 views
22

Tengo una lista de la siguiente manera:¿Cómo escribir un bean de primavera con un constructor que contiene una lista?

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()); 

Me pregunto cómo crear un grano de primavera que se lleva a los manipuladores como uno de sus argumentos, es decir, es posible hacer esto en el applicationContext.xml - ¿Tengo para crear beans separados para la lista y cada uno de los manejadores (AARHandler, etc.) primero? Aquí está mi 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> 

Respuesta

34

Probablemente desea que todos estos controladores sean granos de primavera también. Esta es la configuración:

<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

Ésta es la mejor respuesta de los cinco primeros. :-) –

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

Creo que la forma más adecuada de hacerlo es:

<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> 

se puede visitar el siguiente enlace http://springindepth.com/book/index.html

+0

CUIDADO: El enlace me llevó a algún sitio de rep.playzonenow.com con un botón para verificar la oferta; no vaya a ese enlace. – conapart3

5

Si desea que todos los gestores disponibles , Spring también los recogerá a través de Autowiring:

public DiameterClient(@Autowired List<DiameterMessageHandler> handlers){ 
    this.handlers = handlers; 
} 

Ahora Spring inyectará una lista de todos los manejadores disponibles.

Ver Spring Reference 4.9.2: @Autowired

Cuestiones relacionadas