¿Cómo resuelve Spring las dependencias circulares?

A medida que los proyectos siguen creciendo, también lo hace la complejidad de las dependencias. En este caso, el problema de la dependencia circular es particularmente prominente. Como un marco de desarrollo de aplicaciones Java de nivel empresarial ampliamente utilizado, Spring Framework proporciona a los desarrolladores una solución elegante para lidiar con las dependencias circulares. En este artículo, exploraremos cómo Spring resuelve las dependencias circulares.

¿Qué es una dependencia circular?

La dependencia circular se refiere a la existencia de interdependencia entre dos o más beans, lo que resulta en la incapacidad de crear un objeto completo. Por ejemplo, Bean A depende de Bean B y Bean B también depende de Bean A, formando un ciclo de dependencia. Esta situación puede hacer que las instancias de objetos no se creen correctamente, lo que hace que toda la aplicación no funcione.

¿Cómo resuelve Spring las dependencias circulares?

Spring Framework utiliza una técnica llamada "almacenamiento en caché de tres niveles" para resolver dependencias circulares. Específicamente, el caché de tres niveles es el siguiente:

  1. Caché de nivel 1 (Objetos Singleton): Almacena las instancias de Bean que se han creado, es decir, objetos completos.
  2. Caché L2 (Early Singleton Objects): almacena instancias de Bean que están en proceso de creación, es decir, objetos que aún no han completado la inyección de propiedades.
  3. Caché de tres niveles (Singleton Factories): Almacena el objeto de fábrica de la instancia de Bean, que se utiliza para obtener la instancia de Bean completa que aún no se ha creado.

El framework Spring sigue los siguientes pasos en el proceso de creación de beans:

  1. Primero verifique si la instancia de Bean existe en el caché de primer nivel y regrese directamente si existe.
  2. Si no existe en el caché de primer nivel, verifique si la instancia de Bean existe en el caché de segundo nivel y regrese directamente si existe.
  3. Si todavía no existe en el caché de segundo nivel, obtenga el objeto de fábrica de la instancia de Bean del caché de tercer nivel y llame a su método getObject para crear la instancia de Bean. Durante este proceso, la instancia de Bean recién creada se agregará al caché de segundo nivel.
  4. Cuando se procesan las dependencias del Bean, la instancia del Bean se mueve de la memoria caché de segundo nivel a la memoria caché de primer nivel, y el objeto de fábrica correspondiente se elimina de la memoria caché de tercer nivel.

A través de este mecanismo de almacenamiento en caché de tres niveles, Spring puede resolver el problema de dependencia circular en el proceso de creación de beans. Cuando se encuentra una dependencia circular, dado que la instancia de Bean interdependiente ya está en el caché de segundo nivel, se puede obtener e inyectar directamente, evitando así el fenómeno de punto muerto.

Cabe señalar que el marco Spring solo admite la resolución de dependencias circulares en el ámbito Singleton. Para beans con alcance de prototipo (Prototype), dado que se crea una nueva instancia cada vez que se obtiene un bean, Spring no puede resolver el problema de dependencia circular en este caso.

¿Cómo evitar las dependencias circulares?

Aunque Spring Framework puede resolver el problema de las dependencias circulares, en el proceso de desarrollo real, es mejor evitar las dependencias circulares tanto como sea posible. Aquí hay algunas sugerencias:

  1. Divida razonablemente módulos y paquetes: al organizar clases con funciones similares en el mismo paquete o módulo, se puede reducir el riesgo de dependencias circulares.
  2. Use el aislamiento de la interfaz: cuando necesite confiar en otra clase, intente confiar en la interfaz en lugar de la clase de implementación concreta. Esto reduce el grado de acoplamiento entre clases y reduce la posibilidad de dependencias circulares.
  3. Principio de inversión de dependencia: siga el principio de inversión de dependencia, que los módulos de alto nivel no deben depender de módulos de bajo nivel, ambos deben depender de abstracciones. Esto ayuda a reducir el acoplamiento entre módulos, evitando así dependencias circulares.

Resumir

Al introducir un mecanismo de caché de tres niveles, Spring Framework puede resolver el problema de la dependencia circular en el proceso de creación de beans de ámbito único. Sin embargo, en el desarrollo real, debemos tratar de evitar la generación de dependencias circulares para reducir la complejidad del sistema y los costos de mantenimiento. Seguir principios de diseño como la modularidad, el aislamiento de la interfaz y los principios de inversión de dependencias puede ayudarnos a administrar mejor el código y reducir el riesgo de dependencias circulares.

Supongo que te gusta

Origin blog.csdn.net/kaka_buka/article/details/129985821
Recomendado
Clasificación