Maison >Java >javaDidacticiel >printemps-: pourquoi-Spring-Cannot-Match-by-Name-for-Injection
Injection de dépendance à ressort: pourquoi ne peut-elle pas correspondre automatiquement au nom?
basé sur le type , pas les noms. Lors de la rencontre de plusieurs types du même type (comme TenantDataSource), il ne reviendra pas automatiquement pour correspondre en fonction du nom du paramètre. En effet, Spring ne peut pas toujours garantir le nom du paramètre dans la méthode pour correspondre au nom de bean.
Java par défaut,ne conservera pas le nom du paramètre dans le bytecode compilé. S'il n'y a pas de configuration spéciale, les noms de paramètres (par exemple, TenantAdataSource et TenantBdataSource) seront effacés pendant la compilation et les ont remplacés par des noms universels, tels que Arg0 et Arg1. Par conséquent, le printemps ne peut pas savoir que la locationadatasource fait référence au haricot appelé "Tenanta-Datasource".
Résolvez le problème de rétention du nom de paramètre
-parameters
<code>javac -parameters MyClass.java</code>
Spring évite les hypothèses pour éviter les accidents. Par exemple, si le nom du paramètre est accidentellement échangé ou nommé, ou si les développeurs s'attendent à des mappages différentes, que se passera-t-il? S'il n'y a pas de guidage clair (tel que
), Spring ne peut pas déterminer l'intention du développeur et choisir de lancer une erreur au lieu d'injecter le mauvais haricot.
@Qualifier
Spring suit le principe de "explicitement mieux que caché". L'injection dépendante doit être prévisible et ne dépend pas des hypothèses des noms de paramètres à l'appariement de la correspondance du nom de bean. Le printemps est cohérent dans différents environnements et cadres. Certaines langues ou cadres (tels que Kotlin) conservent le nom du paramètre par défaut, tandis que d'autres langues ne sont pas conservées.
Quand la correspondance du nom peut-elle fonctionner automatiquement?
Spring 4.3 Nom du paramètre Découverte
Exemple:
-parameters
<code>@Autowired public TenantService(TenantDataSource tenantADataSource, TenantDataSource tenantBDataSource) { this.tenantADataSource = tenantADataSource; this.tenantBDataSource = tenantBDataSource; }</code>Pourquoi le printemps est-il plus enclin à utiliser @qualificier?
-parameters
Utiliser pour assurer la définition et éliminer l'ambiguïté, afin que les développeurs et les cadres puissent clairement intention. @Qualifier
Certaines personnes peuvent penser qu'un cadre comme Spring devrait être plus intelligent, et le nom de bean est automatiquement adapté au nom du paramètre lorsqu'il y a une ambiguïté. Mais:
@Qualifier
Les développeurs utilisent des noms de bean significatifs et des noms de paramètres, mais ils préfèrent également préférer
@Qualifier
pour les scènes multi-exemples, Spring First Injects par type
@Qualifier
) est conservé, Spring évitera la correspondance de correspondance bien connue, à moins que la configuration ne soit claire. -parameters
) au lieu de compter sur une correspondance cachée. Concept de conception de Spring : Les erreurs brumeuses peuvent empêcher les accidents et s'assurer que les développeurs contrôlent pleinement l'injection de dépendance.
@Qualifier
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!