[JAVA] [Spring] Plusieurs beans auto-câblés. (Avec bonus)

Peut être utilisé dans de tels cas

Lorsque vous souhaitez utiliser plusieurs beans (0 à n) enregistrés dans le conteneur par @ Autowired.

supposition

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;

manière

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!!

Bonus: Outre la liste ...

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.

Classe de carte

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!!

Classe facultative

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.

Résumé

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

[Spring] Plusieurs beans auto-câblés. (Avec bonus)
Ressort avec actionneur Kotorin --5
Spring MyBatis @MapperScan Multiple
Essayez la loi de l'inversion des dépendances avec plusieurs projets Spring Boot
Validation personnalisée avec Spring
Printemps avec Kotorin ―― 1. INITIALISATION PRINTEMPS
Télécharger avec Spring Boot
Générer un code à barres avec Spring Boot
Implémenter GraphQL avec Spring Boot
Démarrez avec Spring Boot
Bonjour tout le monde avec Spring Boot!
Spring avec Kotorin --6 Traitement asynchrone
Exécutez LIFF avec Spring Boot
Connexion SNS avec Spring Boot
Téléchargement de fichiers avec Spring Boot
Spring Boot commençant par copie
Ressort avec Kotorin ―― 7. Couche de service
Fonction de connexion avec Spring Security
Utilisez plusieurs bases de données avec Rails 6.0
Utilisation de Mapper avec Java (Spring)
Spring Boot à partir de Docker
Définir des cookies avec Spring Boot
Utiliser Spring JDBC avec Spring Boot
Ajouter un module avec Spring Boot
Premiers pas avec Spring Boot
Lier l'API avec Spring + Vue.js
Créer un micro service avec Spring Boot
Envoyer du courrier avec Spring Boot