web-dev-qa-db-fra.com

Spring autowire une liste

Est-il possible d'utiliser @Autowired avec une liste?

Comme j'ai un fichier de propriétés avec des mimetypes et dans mon fichier de classe j'ai quelque chose comme ça

@Autowired
private List<String> mimeTypes = new ArrayList<String>();
28
karq

Spring 4 prend en charge la possibilité de collecter automatiquement tous les beans d'un type donné et de les injecter dans une collection ou un tableau.

Exemple:

@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 Commande de collections autowired

42
Tho

@Qualifier("..") est déconseillé, essayez plutôt de autowire-by-name en utilisant

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

Voir aussi Comment câbler automatiquement le bean d'usine .

33
Johan Sjöberg

Vous pouvez même créer un Java.util.List dans votre fichier .xml de printemps et injectez-le via @Qualifier dans votre application. À partir de la source de données 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>

Cela changerait donc votre câblage en:

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

Je suggérerais cette approche puisque vous injectez de toute façon une liste de chaînes.

à votre santé!

[~ # ~] modifier [~ # ~]

Si vous voulez injecter des propriétés, jetez un œil à ceci Comment puis-je injecter une valeur de propriété dans un Spring Bean qui a été configuré à l'aide d'annotations?

10
chzbrgla

Je pense que vous aurez besoin d'un qualificatif au minimum. Et l'appel à "nouveau" semble contraire à l'idée d'utiliser Spring. Vous avez le rôle de Spring confus. Si vous appelez "nouveau", alors l'objet n'est pas sous le contrôle de Spring.

1
duffymo

Si le bean câblé automatiquement est déclaré dans la même classe (@Configuration) Et que vous en avez besoin pour déclarer un autre bean, alors les travaux suivants fonctionnent:

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

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

Naturellement, il se comporte correctement même si vous remplacez le bean mimeTypes dans une autre configuration. Pas besoin d'annotations explicites @Qualifier Ou @Resource.

0
stuchl4n3k