Dependencia circular
Definición: la dependencia circular es una referencia circular, lo que significa que dos o más frijoles se mantienen entre sí, por ejemplo, la circularitada se refiere a la circularidadb, la circularidadb se refiere a la circularidad y la circularidad se refiere a la circularitada. Formar una relación de referencia circular.
Cuando usa Spring, si utiliza principalmente el método de inyección de dependencia basado en constructor, puede encontrar dependencias circulares. En resumen, el constructor de Bean A depende de Bean B, y el constructor del Bean B depende de Bean A. En este caso, la primavera arrojará una recreación de beanCreationException en el momento de la compilación.
Clase A
@ComponentPublic Class ClassA {private classb classB; @AUtowired public classA (classb classb) {this.classb = classb; } public void printClass () {System.out.println ("class a =" + this); System.out.println ("clase b =" + classb); }}Clase B
@ComponentPublic Class ClassB {private classA classA; @AUTOWIRED Public ClassB (ClassA ClassA) {this.classa = classA; } public void printClass () {system.out.println ("class a =" + classa); System.out.println ("clase b =" + this); }}prueba
@ContextConfiguration (classes = {classa.class, classb.class}) @runwith (springrunner.class) public class mytest {@aUtoWired private classA classA; @AUtowired private classb classb; @Test public void name () {ClassA.printClass (); classb.printClass (); }}razón
En este momento, encontrará que se lanza una excepción de BeanCreationException. La razón de esto es que cuando la primavera crea un frijol, primero instanciará el objeto y luego inyectará la dependencia. Supongamos que Spring crea la Clase A primero, luego encontrará que hay una dependencia de Clase B en el constructor, por lo que recurrirá para crear la Clase B, y luego encontrará la dependencia de la Clase A en el Constructor de la Clase B. En este momento, la Clase A no se ha inicializado, por lo que se convertirá en crear la Clase A, que caerá en un Bucle Dead.
Solución
El cambio a la inyección de dependencia basada en el setter puede resolver este problema. Debido a que la inyección de dependencia basada en el setter primero llamará al constructor predeterminado para instanciar el objeto y luego llamar a Setter para implementar la inyección de dependencia. De esta manera, no hay dependencia en la etapa de instanciación del objeto. Por lo tanto, después de la instancia de clase A, se llama a la clase B, y después de la instancia de clase B, comienza a establecer valores. En este momento, la clase A ya está instanciada, por lo que puede referirse con éxito a la Clase A.
Resumir
Lo anterior es todo el contenido de este artículo. Espero que el contenido de este artículo tenga cierto valor de referencia para el estudio o el trabajo de todos. Si tiene alguna pregunta, puede dejar un mensaje para comunicarse. Gracias por su apoyo a Wulin.com.