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:
StaticMessageSourceimplementación simple que permite registro programatico de mensajes.ResourceBundleMessageSourceimplementación que accesa recursos bundle con basename específicos.ReloadableResourceBundleMessageSourceimplementacion 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:
ClassPathXmlApplicationContextFileSystemXmlApplicationContextGenericXmlApplicationContextAnnotationConfigApplicationContext
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.