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.Daemon
Daemon
He visto esta pregunta en algún lugar sobre stackoverflow, pero no puedo encontrarla de nuevo. Disculpas por ello.
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
.