Antes de leer este post, te recomiendo los anteriores para un mejor entendimiento:

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.


Franky Villadiego

Volando hacia el desarrollo productivo!