Ceci est une continuation de About Spring②. Cette fois, je résumerai brièvement l'association des haricots.
Quel objet se comporte comme un bean dans le chapitre précédent et l'avant-dernier chapitre? J'ai résumé la spécification et le comportement du conteneur DI qui le stocke. Dans la méthode d'injection de bean de base, la méthode getBean a été appelée avec la classe de bean en tant qu'argument de la classe ContextConfiguration, mais comment le bean est-il spécifié dans le câblage automatique à l'aide de @Autowired? C'est ça?
Vue d'ensemble → Déterminez par le type de classe spécifié lors de l'utilisation.
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;
}
Le bean du type spécifié n'existe pas ⇒ NoSuchBeanDefinitionException se produit
Plusieurs beans du type spécifié sont enregistrés dans le conteneur ⇒ NoUniqueBeanDefinitionException se produit
En particulier, il arrive souvent qu'il y ait plusieurs classes qui héritent d'une certaine classe parent, et c'est le sens de DI d'écrire la classe enfant dans le code source lors de la DI à chaque fois. Si vous faites un bean dans la classe parent, vous obtiendrez une NoUniqueDefinitionException, et ainsi de suite. La méthode suivante consiste à résoudre ce problème.
Vue d'ensemble → Définissez un nom unique lors de la définition d'un bean et spécifiez ce nom lors de la récupération
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;
}
Dans le cas ci-dessus, les deux sont des classes qui ont HogeClass comme parent, donc une erreur se produira à moins qu'elles ne soient liées par leur nom par Qualifer. Si vous souhaitez spécifier le nom individuellement, procédez comme suit
Config.class
@Congiguration
@ComponentScan
public class Config{
@Bean(name = "hoge1")
HogeClass hogeClass(){
return new HogeClass();
}
@Bean(name = "fuga1")
HogeClass fugaClass(){
return new FugaClass();
}
}
##Aperçu de la prochaine fois
Je veux terminer le contenu de l'analyse des composants et la portée du bean ensemble.
Recommended Posts