2011-09-16 8 views
48

Tengo una clase que tiene una lista de objetos del tipo Daemon.Enlazar los beans de referencia en lista por tipo

class Xyz {  
    List<Daemon> daemons; 
} 

Mi configuración de muelles tiene este aspecto.

<bean id="xyz" class="package1.Xyz"> 
    <property name="daemons" ref="daemonsList"> 
</bean> 

<bean id="daemon1" class="package1.DaemonImpl1"/> 
<bean id="daemon2" class="package1.DaemonImpl2"/> 

<bean id="daemonsList" class="java.util.ArrayList"> 
     <constructor-arg> 
      <list> 
       <ref bean="daemon1" />  
       <ref bean="daemon2" /> 
      </list> 
     </constructor-arg> 
</bean> 

Ahora en lugar de cableado explícitamente cada aplicación demonio en la lista, es posible Autowire todos los granos de tipo Daemon automáticamente en la lista. El problema que intento resolver es: si alguien crea un bean de nueva implementación de la clase Daemon y se olvida de conectarlo a la lista.

He visto esta pregunta en algún lugar de stackoverflow pero no he podido encontrarla de nuevo. Disculpas por ello

+2

Ver http://stackoverflow.com/questions/1363310/auto-wiring-a-list-using-util-schema-gives-nosuchbeandefinitionexception/1363435#1363435 – skaffman

+0

Gracias skaffmen. Intentaré entender el concepto involucrado aquí. – RandomQuestion

Respuesta

54

Se debe trabajar como esto (quitar el grano ArrayList de su XML):

public Class Xyz {  

    private List<Daemon> daemons; 

    @Autowired 
    public void setDaemons(List<Daemon> daemons){ 
     this.daemons = daemons; 
    } 

} 

No creo que hay una manera de hacer esto en XML.


Ver: 3.9.2. @Autowired and @Inject:

También es posible proporcionar todos los granos de un tipo particular de la ApplicationContext mediante la adición de la anotación a un campo o método que espera una matriz de ese tipo:

public class MovieRecommender { 

    @Autowired 
    private MovieCatalog[] movieCatalogs; 

    // ... 
} 

Lo mismo se aplica para las colecciones proporcionado:

public class MovieRecommender { 

    private Set<MovieCatalog> movieCatalogs; 

    @Autowired 
    // or if you don't want a setter, annotate the field 
    public void setMovieCatalogs(Set<MovieCatalog> movieCatalogs) { 
     this.movieCatalogs = movieCatalogs; 
    } 

    // ... 
} 

Por cierto, a partir de la primavera 4.x, these lists can be ordered automatically using the @Ordered mechanism.

+5

Gracias Sean. Funcionó. Pensé, añadiendo la notación '@ Autowired' a' List daemons' haría la búsqueda de primavera de beans que son de tipo 'java.util.List'. Es sorprendente cómo descubre el tipo de objetos en la lista y los conecta a la lista y finalmente los cables a la lista en el objeto principal. – RandomQuestion

+0

@al. no hay problema. Uso esta función mucho yo mismo –

+0

Al autocablear "List daemons", ¿cómo sabe Spring que debería buscar beans de tipo Daemon, ya que este es de tipo genérico y no estará disponible en tiempo de ejecución? – elyor

Cuestiones relacionadas