2011-06-07 21 views
20

¿Es posible usar @Autowired con una lista?Spring autowire a list

Como tengo el archivo de propiedades con tipos MIME y en mi archivo de clase que tener algo como esto

@Autowired 
private List<String> mimeTypes = new ArrayList<String>(); 
+5

Ha pasado tiempo, si alguna de las respuestas fue útil, márquela como correcta, para que otras personas con la misma pregunta puedan identificar fácilmente cualquier respuesta útil. – chzbrgla

+1

posible duplicado de [El cableado automático de una lista utilizando el esquema util da NoSuchBeanDefinitionException] (http://stackoverflow.com/questions/1363310/auto-wiring-a-list-using-util-schema-gives-nosuchbeandefinitionexception) – skaffman

Respuesta

1

Creo que necesitará un calificador como mínimo. Y el llamado a "nuevo" parece contrario a la idea de usar Spring. Usted tiene el papel de Spring confundido. Si llama "nuevo", entonces el objeto no está bajo el control de Spring.

+0

Simplemente sobrescribe el objeto completo.Spring no sabía (o no le importaba) que había algo allí antes. –

+0

Usando granos con un perfil de prototipo, incluso puede usar el 'nuevo' y aún así tener ese resorte de frijol manejado por cierto http://static.springsource.org/spring/docs/current/reference/beans.html#beans-factory-scopes -prototipo – chzbrgla

10

Incluso puede crear un java.util.List dentro de su resorte .xml e inyectarlo a través de @Qualifier en su aplicación. Desde el SpringSource http://static.springsource.org/spring/docs/current/reference/xsd-config.html:

<!-- creates a java.util.List instance with the supplied values --> 
<util:list id="emails"> 
    <value>[email protected]</value> 
    <value>[email protected]</value> 
    <value>[email protected]</value> 
    <value>[email protected]</value> 
</util:list> 

Así que esto iba a cambiar el cableado a:

@Autowired 
@Qualifier("emails") 
private List<String> mimeTypes = new ArrayList<String>(); 

que sugeriría este enfoque ya que estás inyectando una lista de cadenas de todos modos.

¡salud!

EDITAR

Si desea inyectar propiedades, echar un vistazo a este How can I inject a property value into a Spring Bean which was configured using annotations?

32

@Qualifier("..") no se recomienda, en lugar tratar de Autowire por nombre usando

private @Resource(name="..") List<Strings> mimeTypes; 

Vea también How to autowire factorybean.

+2

+1 ¡Excelente hallazgo! Solo estaba tratando de descubrir por qué no podía hacer que funcionara este escenario. –

25

Spring 4 admite la capacidad de recopilar automáticamente todos los beans de un tipo determinado e insertarlos en una colección o matriz.

Ejemplo:

@Component 
public class Car implements Vehicle { 
} 

@Component 
public class Bus implements Vehicle { 
} 

@Component 
public class User { 
    @Autowired 
    List<Vehicle> vehicles;//contains car and bus 
} 

Ref: Spring 4 Ordering Autowired Collections

+1

¿Qué sucede cuando no hay un bean de ese tipo definido? ¿Se autocableará una lista vacía? – user2798694

+0

@ user2798694 Debe estar vacía o nula. – ThoQ

0

Si el grano de autowired se declara en la misma clase (@Configuration) y que necesita que declare otro bean, a continuación, siguiendo las obras:

@Bean 
public BeanWithMimeTypes beanWithMimeTypes() { 
    return new BeanWithMimeTypes(mimeTypes()); 
} 

@Bean 
public List<String> mimeTypes() { 
    return Arrays.<String>asList("text/html", "application/json); 
} 

Naturalmente se comporta correctamente incluso si anula el bean mimeTypes en otra configuración. No es necesario realizar anotaciones explícitas de @Qualifier o @Resource.

+1

Esto simplemente muestra cómo usar un constructor (lo cual está bien). Pero debe señalarse que en este ejemplo no es necesario anotar mimeTypes() con @Bean a menos que desee que su resultado esté disponible en el contexto de la aplicación por algún otro motivo que no sea la creación del componente BeanWithMimeTypes. –

Cuestiones relacionadas