Red de conocimiento informático - Conocimiento sistemático - Este artículo es suficiente para una comprensión profunda de la inversión de control y la inyección de dependencia de Spring.

Este artículo es suficiente para una comprensión profunda de la inversión de control y la inyección de dependencia de Spring.

La inversión de control (IOC) tiene como objetivo proporcionar un mecanismo más simple para establecer dependencias en componentes y gestionar esas dependencias a lo largo de su ciclo de vida. Generalmente, la inversión de control se puede dividir en dos subtipos: Inyección de dependencia (DI) y Búsqueda de dependencia (DL). Cada uno de estos subtipos se puede descomponer en la implementación específica de los servicios IOC.

Extracción de dependencia (Dependencia). Pull), es decir, extraer dependencias del registro según sea necesario. El siguiente código muestra la extracción de dependencias basada en Spring

Búsqueda de dependencias contextualizadas (CDL), que también es un subtipo de búsqueda de dependencias, algo similar a la dependencia. pull, pero en CDL, la búsqueda se realiza en el contenedor que administra el recurso. Este contenedor generalmente lo proporciona el servidor o marco de aplicaciones (Tomcat, JBoss, Spring). Por ejemplo, el siguiente código muestra una interfaz de contenedor de búsqueda de dependencia. el servicio

Los componentes necesitan implementar esta interfaz. Cuando el contenedor esté listo para pasar dependencias al componente, se llamará al método performLookup() de cada componente, y luego el componente podrá usar el contenedor. interfaz para encontrar todas las dependencias requeridas

La inyección de dependencia del constructor ocurre cuando se proporciona una dependencia en el constructor del componente

El contenedor IOC inyecta las dependencias del componente a través de métodos de configuración estilo JavaBean <. /p>

En Spring, también se admite otro tipo de inyección llamado inyección de campo. Este tipo de inyección se introducirá más adelante cuando aprenda a usar la anotación @Autowire para el ensamblaje automático.

El núcleo de la inyección de dependencia de Spring. El contenedor es BeanFactory, que es responsable de administrar los componentes, incluidas las dependencias y sus ciclos de vida. Si queremos obtener un componente (Bean), debemos crear una instancia que implemente la interfaz BeanFactory y configurarlo

Aunque BeanFactory se puede configurar mediante programación, el enfoque más común es utilizar algún tipo de archivos de configuración. configurarlo externamente. La configuración de Bean se puede representar mediante una instancia de una clase que implementa la interfaz BeanDefinition. Para cualquier clase de implementación BeanFactory que implemente la interfaz BeanDefinitionReader, puede usar PropertiesBeanDefinitionReader o XmlBeanDefinitionReader para leer los datos de BeanDefinition del archivo de configuración.

Definir. una interfaz establecida:

A continuación, echemos un vistazo a cómo se inicializa y usa Spring's BeanFactory para obtener instancias de Bean.

La interfaz ApplicationContext es una extensión de BeanFactory Además de los servicios DI. También proporciona otros servicios como transacciones y AOP.

Al desarrollar aplicaciones basadas en Spring, se recomienda interactuar con Spring a través de la etiqueta de la interfaz ApplicationContext

para indicarle a Spring que escanee el código para encontrar beans inyectados con anotaciones como @Component, así como soporte en el paquete especificado (y todos sus subpaquetes)) beans anotados con @Autowire, etc.

La clase de configuración está anotada con @Configuration y contiene métodos anotados con @Bean. Estos métodos son llamados directamente por el contenedor IOC. para crear una instancia del bean. El nombre del bean es el mismo que el utilizado para la creación. Sus métodos tienen el mismo nombre

Si desea leer la información de configuración de esta clase, necesita una implementación de ApplicationContext diferente. p>

Use la configuración XML para configurar la inyección de setter, que debe especificarse debajo de la etiqueta, inyecte una dependencia en ella

Si usa anotaciones, solo necesita agregar una anotación @Autowired a el método setter

Inyectar usando XML