Este capítulo examina la implementación del principio de inversión de control (IoC) en Spring Framework. IoC también se conoce como inyección de dependencia (DI). Este es el proceso mediante el cual los objetos definen sus dependencias (es decir, los otros objetos sobre los que operan) solo a través de argumentos del constructor, argumentos del método de fábrica o propiedades que se establecen en una instancia del objeto después de que una fábrica lo crea o lo devuelva. método. Luego, el contenedor inyecta estas dependencias cuando se crea el bean. Este proceso es esencialmente una inversión (de ahí el nombre, Inversión de Control) del propio bean, que controla de forma independiente la creación o ubicación de sus dependencias mediante la construcción directa de clases o un mecanismo como una plantilla de Localizador de Servicios.

Los paquetes org.springframework.beans y org.springframework.context son la base del contenedor Spring Framework IoC. Interfaz BeanFactory proporciona un mecanismo de configuración avanzado capaz de gestionar objetos de cualquier tipo. ApplicationContext es una subinterfaz de BeanFactory. Añade:

  • Integración más sencilla con funciones de AOP en Spring

  • Procesamiento de recursos de mensajes (para uso en internacionalización)

  • Eventos de publicación

  • Contextos específicos del nivel de aplicación, como WebApplicationContext para su uso en aplicaciones web.

En resumen, BeanFactory proporciona la configuración y la funcionalidad principales, mientras que ApplicationContext agrega más funciones específicas de la empresa. ApplicationContext es un superconjunto completo de BeanFactory y se utiliza exclusivamente en este capítulo al describir el contenedor Spring IoC. Para obtener más información sobre el uso de BeanFactory en lugar de ApplicationContext, consulte la sección en BeanFactory API.

En Spring, los objetos que forman el núcleo de su aplicación y son administrados por el contenedor Spring IoC se llaman beans. Un bean es un objeto creado, compilado y administrado por el contenedor Spring IoC. De lo contrario, un bean es simplemente uno de los muchos objetos de su aplicación. Los beans y las dependencias entre ellos se reflejan en los metadatos de configuración utilizados por el contenedor.

Brevemente sobre los contenedores

La interfaz org.springframework.context.ApplicationContext representa el contenedor Spring IoC y es responsable de crear instancias, configurar y componer beans. El contenedor recibe instrucciones sobre qué objetos crear, configurar y vincular leyendo los metadatos de configuración. Los metadatos de configuración están en forma de XML, anotaciones Java o código Java. Esto le permite expresar los objetos que componen una aplicación y las ricas interdependencias entre esos objetos.

Varias implementaciones de la interfaz ApplicationContext vienen con Spring. Las aplicaciones independientes normalmente crean una instancia de ClassPathXmlApplicationContext o FileSystemXmlApplicationContext. Aunque XML es el formato tradicional para definir metadatos de configuración, puede indicarle al contenedor que utilice anotaciones o código Java como formato de metadatos proporcionando una pequeña cantidad de configuración XML para habilitar de forma declarativa la compatibilidad con estos formatos de metadatos adicionales.

En la mayoría de los casos de uso, no se requiere código personalizado explícito para crear una o más instancias de un contenedor Spring IoC. Por ejemplo, en un escenario de aplicación web, ocho (más o menos) líneas de plantilla de descriptor web XML en el archivo web.xml de la aplicación suelen ser suficientes. Si está utilizando Spring Tools para Eclipse (un entorno de desarrollo basado en Eclipse), puede crear fácilmente esta configuración estándar con unos pocos clics o pulsaciones de teclas.

El siguiente diagrama muestra una vista de alto nivel de cómo funciona Spring. Las clases de aplicación se combinan con metadatos de configuración para que una vez que se crea e inicializa ApplicationContext, tengas un sistema o aplicación completamente configurado y ejecutable.

Metadatos de configuración

Como se muestra en el diagrama anterior, el contenedor Spring IoC utiliza una forma de metadatos de configuración. Estos metadatos de configuración son la forma en que usted, el desarrollador de la aplicación, le indica al contenedor Spring cómo crear, configurar y diseñar objetos en su aplicación.

Los metadatos de configuración se presentan tradicionalmente en un formato XML simple e intuitivo, que es lo que se utiliza en gran parte de este capítulo para explicar conceptos y capacidades clave del contenedor Spring IoC.

Los metadatos basados en XML no son la única forma válida de metadatos de configuración. El contenedor Spring IoC en sí está completamente separado del formato en el que realmente se escriben los metadatos de configuración. Hoy en día, muchos desarrolladores optan por una configuración basada en Java para sus aplicaciones Spring.

Para obtener información sobre el uso de otras formas de metadatos con un contenedor Spring, consulte:

  • Configuración basada en anotaciones: Spring 2.5 introdujo soporte para metadatos de configuración basados en anotaciones.: Spring 2.5 introducido soporte para metadatos de configuración basados en anotaciones.

  • Configuración basada en Java: desde Spring 3.0, muchas de las funciones proporcionadas por el proyecto Spring JavaConfig se han convertido en parte del núcleo Spring Framework. De esta manera, puede definir beans que sean externos a las clases de su aplicación utilizando archivos Java en lugar de XML. Para utilizar estas nuevas funciones, consulte las anotaciones @Configuration, @Bean, @Import y @DependsOn.

Una configuración de Spring consta de al menos una, pero generalmente más de una, definición de bean que el contenedor debe administrar. Los metadatos de configuración basados en XML configuran estos beans como elementos <bean/> dentro del elemento <bean/> de nivel superior. La configuración de Java normalmente utiliza métodos descritos por @Bean en la clase @Configuration.

Estas definiciones de beans corresponden a los objetos reales que componen su aplicación. Por lo general, define objetos de capa de servicio, objetos de acceso a datos (DAO), objetos de visualización como instancias de Struts Action, objetos de infraestructura como Hibernate SessionFactories, JMS Queues y así sucesivamente. Normalmente, los objetos de dominio detallados no se configuran en un contenedor porque el DAO y la lógica empresarial suelen ser responsables de crear y cargar objetos de dominio. Sin embargo, puede utilizar la integración de Spring con AspectJ para configurar objetos que se crearon fuera del control del contenedor IoC.

El siguiente ejemplo muestra la estructura básica de los metadatos de configuración basados en XML:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="..." class="...">  
        <!-- los colaboradores y la configuración de este bean se encuentran aquí -->
    </frijol>
    <bean id="..." class="...">
        <!-- los colaboradores y la configuración de este bean se encuentran aquí -->
    </frijol>
    <!-- vea más definiciones de beans aquí -->
</beans>
  1. El atributo id es una cadena que identifica la definición de un bean individual.
  2. El atributo class especifica el tipo de bean y utiliza el nombre de clase completo.

El valor del atributo id se refiere a los objetos que interactúan. El XML para hacer referencia a objetos que interactúan no se muestra en este ejemplo.