[JAVA] [Frühling] Mehrere Bohnen automatisch verdrahtet. (Mit Bonus)

Kann in solchen Fällen verwendet werden

Wenn Sie mehrere (0 bis n) Beans verwenden möchten, die von @ Autowired im Container registriert wurden.

Annahme

Zwei Klassen, die die MyService-Schnittstelle implementieren (wobei doSomething definiert ist), werden definiert und im Container registriert.


@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!!")
	}

}

Der Benutzer möchte beide "@ Autowired" verwenden. Wenn Sie jedoch normalerweise "@ Autowired" verwenden, werden Sie wütend auf einen doppelten Bean-Fehler, und es ist Unsinn (abhängig von Ihren Anforderungen), "@ Qualifier" und "@ Autowired" nacheinander hinzuzufügen.

Beispiel für eine unsinnige Injektion



@Qualifier("myServiceImpl1")
@Autowired
private MyService service1;

@Qualifier("myServiceImpl2")
@Autowired
private MyService service2;

Weise

Verwenden Sie die List-Klasse auf der Seite "@ Autowired", um mehrere Beans mit "@ Autowired" zu versehen.

MyServiceExecuter.java



@Autowired
private List<MyService> services;

public void execServices(){
	services.forEach(s -> s.doSomething());
}

Ausgabe


myServiceImpl1!!
myServiceImpl2!!

Bonus: Neben Liste ...

Wenn man es so betrachtet, scheint es andere Klassen als List zu geben, die mit Generics durchgeführt werden können.

Kartenklasse

Wenn Sie in der Map-Klasse "@ Autowired" eingeben, erhalten Sie eine Map mit "Key as Bean Name" und "Value as Bean".

@Autowired
private Map<String,MyService> services;

public void printServices(){
	services.get("myServiceImpl1").doSomething();
	services.get("myServiceImpl2").doSomething();
}

Ausgabe


myServiceImpl1!!
myServiceImpl2!!

Optionale Klasse

Ich weiß nicht, ob die Zielbohne im Container registriert ist. Wenn es registriert ist, möchte ich diese Bohne verwenden, und wenn nicht, muss ich sie nicht injizieren. In diesem Fall

@Autowired(required=false)
private MyService service;

Viele von Ihnen wissen, dass Sie die "NoSuchBeanDefinitionException" vermeiden können, indem Sie "required = false" schreiben. Wenn Sie jedoch null-sicheren Code schreiben möchten, können Sie *** Optional verwenden. *** ***

@Autowired
private Optional<MyService> service;

Wenn Sie dies schreiben, benötigt @Autowired nicht "required = false" und ist vor allem null sicher.

Zusammenfassung

Frühling DI ist tief.

Ich habe keine Informationen darüber gefunden, also habe ich sie zusammengefasst.

Umwelt ↓

springBootVersion = '2.0.5.RELEASE'

[Zusatz] Ich habe den Ausdruck geändert. 2018.09.24

Recommended Posts

[Frühling] Mehrere Bohnen automatisch verdrahtet. (Mit Bonus)
Feder mit Kotorin --5 Aktuator
Frühling MyBatis @MapperScan Multiple
Probieren Sie das Gesetz der Abhängigkeitsumkehr mit mehreren Spring Boot-Projekten aus
Selbstgemachte Validierung mit Spring
Frühling mit Kotorin ―― 1. SPRING INITIALIZR
Mit Spring Boot herunterladen
Generieren Sie mit Spring Boot einen Barcode
Implementieren Sie GraphQL mit Spring Boot
Beginnen Sie mit Spring Boot
Hallo Welt mit Spring Boot!
Feder mit Kotorin --6 Asynchrone Verarbeitung
Führen Sie LIFF mit Spring Boot aus
SNS-Login mit Spring Boot
Datei-Upload mit Spring Boot
Spring Boot beginnt mit dem Kopieren
Feder mit Kotorin ―― 7. Serviceschicht
Anmeldefunktion mit Spring Security
Verwenden Sie mit Rails 6.0 mehrere Datenbanken
Verwenden von Mapper mit Java (Spring)
Spring Boot beginnend mit Docker
Setzen Sie Cookies mit Spring Boot
Verwenden Sie Spring JDBC mit Spring Boot
Modul mit Spring Boot hinzufügen
Erste Schritte mit Spring Boot
API mit Spring + Vue.js verknüpfen
Erstellen Sie mit Spring Boot einen Mikrodienst
Mail mit Spring Boot verschicken