Antes de leer este post, te recomiendo los anteriores para un mejor entendimiento:
- Contenedores e Inyección de Dependencias 01
- Contenedores e Inyección de Dependencias 02
- Contenedor Spring 01
- Contenedor Spring 02
- Contenedor Spring 03
- Inyectar Colecciones en Spring 04
- Ciclo de Vida con Spring 05
Habiamos comentado en el post #1 de Spring que este también ofrece otras características y servicios como transaccionalidad,
AOP, eventos, soporte i18n, contextos y mas. Y que para esto Spring extiende el BeanFactory
con la interface ApplicationContext
.
Ahora todas estas características extras que ofrece ApplicationContext
con respecto a BeanFactory
que son y para que
me sirven?. Veamos en detalles cada una.
Internacionalización (i18n)
La interface ApplicationContext
extiende de MessageSource
para proporcionar estas características. Es necesario definir
un bean del tipo MessageSource
y el ApplicationContext
delega en el la busqueda de mensajes con el método getMessage()
.
Las implemantaciones de MessageSource
son:
StaticMessageSource
implementación simple que permite registro programatico de mensajes.ResourceBundleMessageSource
implementación que accesa recursos bundle con basename específicos.ReloadableResourceBundleMessageSource
implementacion que puede recargar en caliente mensajes.
ApplicationContext
Ahora que ya conocemos una de las características que proporciona ApplicationContext
vamos a usarla.
La interface ApplicationContext
tiene varias implementaciones:
ClassPathXmlApplicationContext
FileSystemXmlApplicationContext
GenericXmlApplicationContext
AnnotationConfigApplicationContext
Haremos los mismos pasos que con DefaultListableBeanFactory
. En este momento usaremos FileSystemXmlApplicationContext
y ClassPathXmlApplicationContext
. La diferencia radica en que el FileSystemXmlApplicationContext
le damos una ruta o
ubicación donde esta nuestro archivo de configuración xml con los beans y con ClassPathXmlApplicationContext
usamos el
classpath para dar la ruta.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//1. Punto de arranque
public class Main {
public static void main(String[] args) {
//2. y 3. Van juntos.
FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext("C:\TU_RUTA\myBeans.xml");
//4.
Office officeBean = context.getBean(Office.class);
officeBean.setMessageToPrint("Hola mundo!!");
officeBean.print();
}
}
Como vemos es mas reducido el código que cuando usamos BeanFactory
.
Aplicando i18n
Tenemos un archivo mensajes.properties
asi:
1
saludo=Hola mundo!
Tenemos el mismo archivo para otros idiomas, por ejemplo para inglés es mensajes_en.properties
.
1
saludo=Hello world!
Configuramos un bean de tipo MessageSource
en nuestro xml así:
1
2
3
4
5
6
7
<bean id="msgSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>mensajes</value>
</list>
</property>
</bean>
Para usarlo hacemos esto:
1
2
3
4
5
6
7
8
9
10
public class Main {
public static void main(String[] args) {
FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext("TU_RUTA/myBeans.xml");
String message = context.getMessage("saludo", null, "Mensaje por defecto", Locale.ENGLISH);
System.out.println(message);
}
}
Como vemos usar las otras características de Spring no es tan complicado.