Dies ist eine Fortsetzung von About Spring②. Dieses Mal werde ich die Bohnenassoziation kurz zusammenfassen.
Welches Objekt verhält sich im vorherigen und im vorletzten Kapitel wie eine Bean? Ich habe die Spezifikation und das Verhalten des DI-Containers zusammengefasst, in dem er gespeichert ist. In der grundlegenden Bean-Injection-Methode wurde die getBean-Methode mit der Bean-Klasse als Argument für die ContextConfiguration-Klasse aufgerufen. Wie wird die Bean jedoch beim automatischen Verdrahten mit @Autowired angegeben? Ist es?
Übersicht → Bestimmen Sie anhand des bei der Verwendung angegebenen Klassentyps.
Config.class
@Congiguration
@ComponentScan
public class Config{
@Bean
HogeClass hogeClass(){
return new HogeClass();
}
@Bean
FugaClass fugaClass(){
return new FugaClass();
}
}
Injection.class
public class Injection{
@Autowired
HogeClass hogeClass;
@Autowired
FugaClass fugaClass;
}
Bean des angegebenen Typs existiert nicht ⇒ NoSuchBeanDefinitionException tritt auf
Im Container werden mehrere Beans des angegebenen Typs registriert ⇒ NoUniqueBeanDefinitionException tritt auf
Insbesondere ist es häufig so, dass es mehrere Klassen gibt, die eine bestimmte übergeordnete Klasse erben, und es ist die Bedeutung von DI, die untergeordnete Klasse jedes Mal in den Quellcode zu schreiben, wenn DI ausgeführt wird. Wenn Sie eine Bean in der übergeordneten Klasse ausführen, erhalten Sie eine NoUniqueDefinitionException usw. Die nächste Methode besteht darin, dies zu lösen.
Übersicht → Legen Sie beim Definieren einer Bean einen eindeutigen Namen fest und geben Sie diesen Namen beim Abrufen an
Config.class
@Congiguration
@ComponentScan
public class Config{
@Bean
HogeClass hogeClass(){
return new HogeClass();
}
@Bean
HogeClass fugaClass(){
return new FugaClass();
}
}
Injection.class
public class Injection{
@Autowired
@Qualifer("hogeClass")
HogeClass hoge;
@Autowired
@Qualifer("fugaClass")
HogeClass fuga;
}
Im obigen Fall handelt es sich bei beiden Klassen um Klassen, deren übergeordnetes Element HogeClass ist. Daher tritt ein Fehler auf, sofern sie nicht von Qualifer namentlich verknüpft werden. Wenn Sie den Namen einzeln angeben möchten, gehen Sie wie folgt vor
Config.class
@Congiguration
@ComponentScan
public class Config{
@Bean(name = "hoge1")
HogeClass hogeClass(){
return new HogeClass();
}
@Bean(name = "fuga1")
HogeClass fugaClass(){
return new FugaClass();
}
}
##Vorschau beim nächsten Mal
Ich möchte den Inhalt des Komponentenscans und den Umfang der Bean zusammen beenden.
Recommended Posts