CodeGym /Cursos Java /Módulo 5. Spring /Proceso de resolución de dependencia

Proceso de resolución de dependencia

Módulo 5. Spring
Nivel 3 , Lección 5
Disponible

El contenedor resuelve las dependencias de beans de la siguiente manera:

  • ElApplicationContext se crea e inicializa utilizando metadatos de configuración que describen todos los beans. Los metadatos de configuración se pueden especificar mediante XML, código Java o anotaciones.

  • Para cada bean, sus dependencias se expresan como propiedades, argumentos del constructor o argumentos del método de fábrica estático (si usa uno en lugar de un constructor normal). Estas dependencias se proporcionan al bean cuando realmente se crea.

  • Cada argumento de propiedad o constructor representa una definición real de un valor que se establecerá, o una referencia a otro bean en el contenedor.

  • Cada argumento de propiedad o constructor que es un valor se convierte del formato especificado al tipo real de esa propiedad o argumento de constructor. De forma predeterminada, Spring puede convertir un valor proporcionado en formato de cadena a todos los tipos integrados, como int, long, String, booleano y así sucesivamente.

El contenedor Spring verifica la configuración de cada bean cuando se crea el contenedor. Sin embargo, las propiedades del bean en sí no se establecen hasta que se crea el bean. Los beans cuyo ámbito es singleton y están configurados para crear instancias previas (el valor predeterminado) se crean cuando se crea el contenedor. De lo contrario, el bean se crea sólo cuando se recibe una solicitud. La creación de un bean crea potencialmente un gráfico de dependencia del bean, a medida que se crean y asignan las dependencias del bean, las dependencias de sus dependencias (y así sucesivamente). Tenga en cuenta que las inconsistencias en la resolución de estas dependencias pueden hacerse evidentes tarde, es decir, cuando se crea por primera vez el bean afectado.

Dependencias cíclicas

Si utiliza principalmente la inyección de constructor, puede crear un escenario de dependencia circular intratable.

Por ejemplo: la clase A requiere una instancia de la clase B mediante inyección basada en constructor, y la clase B requiere una instancia de la clase A mediante inyección basada en constructor. Si configura beans de clases A y B para que se inyecten entre sí, el contenedor Spring IoC detectará esta referencia circular en tiempo de ejecución y generará una BeanCurrentlyInCreationException.

Una posible solución es editar el código fuente de algunas clases para que la configuración se realice utilizando definidores en lugar de constructores. Alternativamente, evite la inyección de dependencia del constructor y use la inyección de setter exclusivamente. En otras palabras, aunque no se recomienda, es posible configurar dependencias circulares mediante la inyección de setter.

A diferencia del caso típico (sin dependencias circulares), una dependencia circular entre el bean A y el bean B hace que uno de los beans se inyecte en el otro antes de que se inicialice por completo (un escenario clásico del huevo y la gallina (causa y efecto). ) )").

En general, puedes confiar en que Spring hará todo bien. Detecta problemas de configuración, como referencias a beans inexistentes y dependencias circulares, mientras se carga el contenedor. Spring establece propiedades y resuelve dependencias lo más tarde posible, después de que se haya creado el bean. Esto significa que un contenedor Spring que se ha cargado correctamente puede generar más tarde una excepción al solicitar un objeto si hay un problema al crear ese objeto o una de sus dependencias; por ejemplo, un bean genera una excepción como resultado de una propiedad faltante o no válida. . Esta visibilidad potencialmente retrasada de algunos problemas de configuración es la razón por la que las implementaciones de ApplicationContext crean instancias previas de beans singleton de forma predeterminada. Al dedicar algo de tiempo y memoria a crear estos beans antes de que realmente los necesite, encontrará problemas de configuración cuando cree el ApplicationContext en lugar de más tarde. Aún puedes anular este comportamiento predeterminado para que los beans singleton se inicialicen de forma diferida en lugar de crear instancias previas lo más rápido posible.

Si no existen dependencias circulares, cuando uno o más beans interactuantes se inyectan en un bean dependiente, cada bean interactuante se configura completamente antes de inyectarse en el bean dependiente. Esto significa que si el bean A depende del bean B, el contenedor Spring IoC configura completamente el bean B antes de llamar al configurador en el bean A. En otras palabras, se crea una instancia del bean (a menos que sea un singleton creado previamente), sus dependencias están instaladas. , y los correspondientes se denominan métodos de ciclo de vida (como el método init configurado o el método de devolución de llamada InitializingBean).

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION