El contenedor IoC de Spring es el núcleo de Spring Framework. El contenedor creará los objetos, los conectará, los configurará y gestionará su ciclo de vida completo desde la creación hasta la destrucción. El contenedor de Spring utiliza la inyección de dependencia (DI) para gestionar los componentes que conforman una aplicación.
Spring proporciona los siguientes dos tipos de contenedores.
- Contenedor BeanFactory
- Contenedor ApplicationContext
Leer más: Inversión de Control e Inyección de Dependencias
BeanFactory
Una BeanFactory no es esencialmente más que la interfaz para una fábrica avanzada capaz de mantener un registro de diferentes beans y sus dependencias.
El BeanFactory
nos permite leer las definiciones de los beans y acceder a ellos utilizando la fábrica de beans.
1.1. Cómo crear BeanFactory
Cuando se utiliza sólo el BeanFactory
podemos crear uno y leer en algunas definiciones de bean en el formato XML de la siguiente manera:
Otras formas de crear bean factory son las siguientes:
Básicamente eso es todo lo que hay. Usando getBean(String)
, puedes recuperar instancias de tus beans; la vista del lado del cliente del BeanFactory
es sorprendentemente simple.
1.2. Métodos de BeanFactory
La interfaz BeanFactory
tiene sólo seis métodos para que el código cliente los llame:
-
boolean containsBean(String)
: devuelve true si elBeanFactory
contiene una definición de bean o una instancia de bean que coincide con el nombre dado -
Object getBean(String)
: devuelve una instancia del bean registrado bajo el nombre dado. Dependiendo de cómo se haya configurado el bean mediante la configuraciónBeanFactory
, se devolverá una instancia singleton y, por tanto, compartida, o un bean recién creado. Se lanzará unBeansException
cuando no se haya podido encontrar el bean (en cuyo caso será unNoSuchBeanDefinitionException
), o se haya producido una excepción al instanciar y preparar el bean -
Object getBean(String, Class)
: devuelve un bean, registrado bajo el nombre dado. El bean devuelto será cast a la Clase dada. Si el bean no puede ser fundido, se lanzarán las excepciones correspondientes (BeanNotOfRequiredTypeException
). Además, se aplican todas las reglas del métodogetBean(String)
(ver arriba) -
Class getType(String name)
: devuelve elClass
del bean con el nombre dado. Si no se ha podido encontrar ningún bean con el nombre dado, se lanzará unNoSuchBeanDefinitionException
-
boolean isSingleton(String)
: determina si la definición del bean o la instancia del bean registrada bajo el nombre dado es o no un singleton. Si no se puede encontrar ningún bean correspondiente al nombre dado, se lanzará unNoSuchBeanDefinitionException
-
String getAliases(String)
: Devuelve los alias para el nombre del bean dado, si se definió alguno en la definición del bean
ApplicationContext
El contenedor ApplicationContext añade más funcionalidades específicas de la empresa, como la capacidad de resolver mensajes textuales desde un fichero de propiedades y la capacidad de publicar eventos de la aplicación a los oyentes de eventos interesados. Este contenedor está definido por la interfaz org.springframework.context.ApplicationContext.
El contenedor ApplicationContext incluye toda la funcionalidad del contenedor BeanFactory, por lo que generalmente se recomienda sobre el BeanFactory. BeanFactory
Todavía se puede utilizar para aplicaciones ligeras como dispositivos móviles o aplicaciones basadas en applets donde el volumen de datos y la velocidad son significativos.
2.1. Tipos de ApplicationContext
Las implementaciones más utilizadas de ApplicationContext
son:
- FileSystemXmlApplicationContext – Este contenedor carga las definiciones de los beans desde un fichero XML. Aquí es necesario proporcionar la ruta completa del archivo de configuración de beans XML al constructor.
- ClassPathXmlApplicationContext – Este contenedor carga las definiciones de los beans desde un archivo XML. Aquí no es necesario proporcionar la ruta completa del archivo XML, pero es necesario establecer CLASSPATH correctamente porque este contenedor buscará el archivo XML de configuración de beans en CLASSPATH.
- WebXmlApplicationContext – Este contenedor carga el archivo XML con las definiciones de todos los beans desde una aplicación web.
2.2. Cómo crear ApplicationContext
Un código de ejemplo para la instanciación del contexto de aplicación tendrá el siguiente aspecto.