Si l'injection de constructeur est utilisée, un scénario de dépendance circulaire qui ne peut pas être analysé peut être créé.
Qu'est-ce que la dépendance circulaire
La dépendance circulaire est en fait une référence circulaire, c'est-à-dire que deux haricots ou plus se tiennent mutuellement et finissent par former une boucle fermée. Par exemple, A dépend de B, B dépend de C, et C dépend de A. comme le montre la figure ci-dessous:
Notez qu'il ne s'agit pas d'un appel de boucle à la fonction, mais d'une interdépendance de l'objet. Les appels de boucle sont en fait une boucle morte à moins qu'il y ait une condition finale.
Il y a des scénarios de dépendance à boucle au printemps:
(1) Dépendance circulaire du constructeur (2) Dépendance circulaire de l'attribut de champ.
Comment détecter s'il y a une dépendance circulaire
Il est relativement facile de détecter les dépendances circulaires. Lorsque le haricot est créé, il peut marquer le haricot. Si l'appel récursif est de retour et constate qu'il est créé, cela signifie que la dépendance circulaire est.
Voici la situation que j'ai rencontrée, la structure du code est la suivante:
Classe de configuration de SpringSecurity:
@ConfigurationPublic Class BrowseSeSecurityConfig étend WebSecurityConfigurerAdapter {private final userDetailSService UserDetailSService; / ** * Injecter UserDetailSService via le constructeur de classe de configuration * / @Autowired public BrowseSeSeCurityConfig (UserDetailSService userDetailSService) {this.userDetailSservice = userDetailSService; } / ** * Déclarez l'encodeur de cryptage dans la classe de configuration * / @Bean Public PasswordEncoder PasswordEncoder () {return new BCryptPasswordEncoder (); } ... ...}Classe UserDetailSService:
@ComponentPublic class MyUserDetailService implémente userDetailSService {Private Final MotwayEncoder MotwayEncoder; Logger privé = loggerfactory.getLogger (getClass ()); / ** * Injecter le mot de passe encodeur via le constructeur * / @Autowired public myuserDetailService (mot de passe de mot de passe encodeur) {this.passwordEncoder = mot de passe encodeur; } ... ...}Après l'exécution, Spring lance le message d'erreur suivant:
Description:
Les dépendances de certains des haricots du contexte d'application forment un cycle:
┌fiques
| BrowseSecurityConfig défini dans le fichier [d: /code/java/ideaprojects/mango-security/mango-security-browser/target/classes/stu/mango/security/browser/browsersecurityconfig.class]
↑ ↓
| MyUserDetailService défini dans le fichier [d: /code/java/ideaprojects/mango-security/mango-security-browser/target/classes/stu/mango/security/browser/myuserdetailservice.class]
└fiques
Dans cet exemple, BrowseSeSecurityConfig injecte l'instance userDetailSService via le constructeur, et le userDetailSService est injecté dans le mot de passe-code déclaré dans le BrowseSeCurityConfig via le constructeur.
En résumé, la dépendance circulaire du haricot de ressort signifie que la classe A doit injecter une instance de classe B (ou un haricot déclaré en b) dans le constructeur, tandis que la classe B doit injecter une instance de classe A (ou un haricot déclaré en a) dans le constructeur. Si les haricots de la classe A et de la classe B sont configurés pour s'injecter mutuellement, le conteneur Spring IOC détecte cette référence de boucle au moment de l'exécution et soulève un BeanCurrently INCRÉATIONException. Contrairement au cas typique (sans dépendances circulaires), la dépendance circulaire entre le haricot A et le haricot B force l'un des haricots à injecter dans l'autre avant d'être complètement initialisé (il s'agit d'un scénario typique de «Poulet en premier ou d'oeuf»).
Solution
Pour le dire simplement, il ne s'agit pas d'utiliser l'injection de dépendance basée sur le constructeur. Il peut être résolu par la méthode suivante.
Utilisez l'annotation @Autowired sur le terrain et laissez le printemps décider d'injecter au bon moment. 【recommander】
Remplacez l'injection de dépendance basée sur le constructeur par l'injection de dépendance basée sur le setter pour résoudre la dépendance circulaire.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.