Lorsque vous souhaitez utiliser plusieurs beans (0 à n) enregistrés dans le conteneur par @ Autowired
.
Deux classes qui implémentent l'interface MyService (où doSomething est défini) sont définies et enregistrées dans le conteneur.
@Component("myServiceImpl1")
public class MyServiceImpl1 implements MyService {
@Override
public void doSomething() {
System.out.println("myServiceImpl1!!")
}
}
@Component("myServiceImpl2")
public class MyServiceImpl2 implements MyService {
@Override
public void doSomething() {
System.out.println("myServiceImpl2!!")
}
}
L'utilisateur souhaite les utiliser tous les deux @ Autowired
. Cependant, si vous normalement @ Autowired
, vous vous fâcherez avec une erreur de bean en double, et il est absurde (selon vos besoins) d'ajouter @ Qualifier
et @ Autowired
un par un.
Exemple d'injection absurde
@Qualifier("myServiceImpl1")
@Autowired
private MyService service1;
@Qualifier("myServiceImpl2")
@Autowired
private MyService service2;
Pour @ Autowired
plusieurs beans, utilisez la classe List du côté @ Autowired
.
MyServiceExecuter.java
@Autowired
private List<MyService> services;
public void execServices(){
services.forEach(s -> s.doSomething());
}
production
myServiceImpl1!!
myServiceImpl2!!
En regardant les choses de cette manière, il semble qu'il existe différentes classes autres que List qui peuvent être faites en utilisant Generics.
Si vous entrez @ Autowired
dans la classe Map, vous pouvez obtenir une Map avec Key as Bean Name
et Value as Bean
.
@Autowired
private Map<String,MyService> services;
public void printServices(){
services.get("myServiceImpl1").doSomething();
services.get("myServiceImpl2").doSomething();
}
production
myServiceImpl1!!
myServiceImpl2!!
Je ne sais pas si le bean cible est enregistré dans le conteneur. S'il est enregistré, je veux utiliser ce bean, et sinon, je n'ai pas à l'injecter. Dans ce cas
@Autowired(required=false)
private MyService service;
Beaucoup d'entre vous savent que vous pouvez éviter l'exception NoSuchBeanDefinitionException
en écrivant required = false
. Mais si vous souhaitez écrire du code de sécurité null, vous pouvez utiliser *** Facultatif. *** ***
@Autowired
private Optional<MyService> service;
Si vous écrivez ceci, @Autowired n'a pas besoin de required = false
, et surtout, il est nullement sûr.
Spring DI est profond.
Je n'ai trouvé aucune information sur le sentiment d'une recherche rapide, alors je l'ai résumé.
Environnement ↓
springBootVersion = '2.0.5.RELEASE'
[Une addition] J'ai changé l'expression. 24.09.2018
Recommended Posts