Autowire reference beans en la lista por tipo

Tengo una clase que tiene una lista de objetos de tipo.Daemon

class Xyz {    
    List<Daemon> daemons;
}

Mi configuración de resorte se ve así.

<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 cablear explícitamente cada implementación de demonio en la lista, ¿es posible conectar automáticamente todos los beans de tipo automáticamente en la lista? El problema que estoy tratando de resolver es, si alguien crea un grano de nueva implementación de clase y se olvida de conectarlo a la lista.DaemonDaemon

He visto esta pregunta en algún lugar sobre stackoverflow, pero no puedo encontrarla de nuevo. Disculpas por ello.

Respuestas:2 Respuestas 2
Tiempo:hace 10 años, 11 meses
Última modificación:hace 3 años, 1 mes

Solución

Debería funcionar así (elimine el frijol ArrayList de su XML):

public Class Xyz {    

    private List<Daemon> daemons;

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

}

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


Véase: 3.9.2. @Autowired y @Inject:

También es posible proporcionar todos los beans de un tipo particular desde ApplicationContext agregando 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 a las colecciones mecanografiadas:

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, estas listas se pueden ordenar automáticamente utilizando el mecanismo de @Ordered.

Otras respuestas

Deja un comentario