Wenn Sie mehrere (0 bis n) Beans verwenden möchten, die von @ Autowired
im Container registriert wurden.
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;
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!!
Wenn man es so betrachtet, scheint es andere Klassen als List zu geben, die mit Generics durchgeführt werden können.
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!!
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.
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