Si se usa la inyección del constructor, se puede crear un escenario de dependencia circular que no se puede analizar.
¿Qué es la dependencia circular?
La dependencia circular es en realidad una referencia circular, es decir, dos o más frijoles se mantienen entre sí y eventualmente forman un circuito cerrado. Por ejemplo, A depende de B, B depende de C y C depende de A. como se muestra en la figura a continuación:
Tenga en cuenta que esta no es una llamada de bucle a la función, sino una interdependencia del objeto. Las llamadas de bucle son en realidad un bucle muerto a menos que haya una condición final.
Hay escenarios de dependencia de bucle en primavera:
(1) Dependencia circular del constructor (2) Dependencia circular del atributo de campo.
Cómo detectar si hay una dependencia circular
Es relativamente fácil detectar dependencias circulares. Cuando se crea el frijol, puede marcar el frijol. Si la llamada recursiva ha vuelto y descubre que se está creando, significa que la dependencia circular es.
Aquí está la situación que encontré, la estructura del código es la siguiente:
Clase de configuración de SpringSecurity:
@ConfigurationPublic Class BrowserSecurityConfig extiende WebSecurityConfigurerAdapter {Private UserDetailsService UserDetailsService; / ** * Inyecte UserDetailsService a través del constructor de clase de configuración */ @aUtowired public BrowserSecurityConfig (UserDetailsService UserDetailsService) {this.userDetailsService = userDetailsService; } / ** * Declarar el codificador de cifrado en la clase de configuración * / @Bean Public PasswordEncoder contraseñaCoder () {return new BCryptPassPassWordEncoder (); } ... ...}Clase de servicio de usuarios
@ComponentPublic Class MyUSerDetailService implementa UserDetailsService {PasswordEncoder final privado de contraseña de contraseña; private logger logger = loggerFactory.getLogger (getClass ()); / ** * Inyect PasswordEncoder a través del constructor */ @aUtowired public myuserDetailService (contraseña en contraseña contraseña) {this.passwordEncoder = contraseña de contraseña; } ... ...}Después de correr, Spring lanza el siguiente mensaje de error:
Descripción:
Las dependencias de algunos de los frijoles en el contexto de la aplicación forman un ciclo:
┌─se
| BROWSERSECURITYCONFIG definido en el archivo [d: /code/java/ideprojects/mango-security/mango-security-browser/target/classes/stu/mango/security/browser/browseCurityConfig.class]
↑ ↓
| myUSerDetailService definido en el archivo [D: /code/java/ideprojects/mango-security/mango-security-browser/target/classes/stu/mango/security/browser/myuserdetailservice.class]
└─se
En este ejemplo, BROWSERSECURITYCONFIG inyecta la instancia de Servicio de Servicio de Details de usuarios a través del Constructor, y el UserDetailService se inyecta en el ContraseCoder declarado en el BrowsersEcurityConfig a través del constructor.
En resumen, la dependencia circular de Spring Bean significa que la Clase A necesita inyectar una instancia de Clase B (o un Bean declarada en B) en el Constructor, mientras que la Clase B necesita inyectar una instancia de Clase A (o un Bean declarado en A) en el Constructor. Si los frijoles de la Clase A y la Clase B se configuran para inyectarse entre sí, el contenedor Spring IOC detecta esta referencia de bucle en tiempo de ejecución y eleva una beanRIncreationException. A diferencia del caso típico (sin dependencias circulares), la dependencia circular entre el frijol A y el frijoles B obliga a uno de los frijoles a inyectarse en el otro antes de ser completamente inicializado (este es un típico escenario de "primer primer huevo").
Solución
En pocas palabras, no es utilizar la inyección de dependencia basada en constructor. Se puede resolver mediante el siguiente método.
Use la anotación @autowired en el campo y deje que Spring decida inyectar en el momento adecuado. 【recomendar】
Reemplace la inyección de dependencia basada en constructor con inyección de dependencia basada en el establecimiento para resolver la dependencia circular.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.