Spring y PropertyPlaceHolderConfigurer

En muchas ocasiones cuando trabajamos con Spring Framework acabamos teniendo una serie de parametros configurados a nivel del fichero de contexto.xml (o applicationContext.xml) que están ligados a alguno de nuestros beans .Casos habituales son usuario y password de la base de datos , url de acceso a un servicio en concreto, dirección de correo a la que la aplicación envia mensajes etc .Imaginemonos que en nuestro caso disponemos de un bean de servicio que accede a una URL en un puerto determinado como muestra el siguiente fichero de Spring.

<?xml version="1.0" encoding="UTF-8"?></pre>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.com/schema/context"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context-3.2.xsd">

<bean id="servicio" class="com.arquitecturajava.properties.Servicio">
 <property name="url" value="http://tomcatRemoto"></property>
 <property name="puerto" value="8080"></property>
 </bean>
</beans>

En principio nos puede parecer bastante cómodo configurarlo de esta manera ya que podremos cambiar los parametros a nivel fichero de configuración de Spring cuando lo necesitemos.

Sin embargo la realidad es que nosotros no seremos los que modifiquemos estos parámetros sino que habitualmente lo hará un perfil de administrador cuando la aplicación se despliegue o se mantenga en un entorno de producción . Esto complica un poco el tema ya que los administradores no suelen estar habituados a manejarse con este framework y no les resultara sencillo abrir un fichero XML que puede tener una estructura compleja y realizar modificaciones.

Para solventar este problema y organizar mejor todos los grupos de parámetros que nuestro fichero de configuración pueda tener Spring nos provee de una clase de utilidad denominada PropertyPlaceholderConfigurer . Esta clase nos permite extraer parametrizaciones del fichero de configuración de Spring  y ubicarlas en ficheros de propiedades.De tal forma que tanto para nosotros como para los administradores sea mas sencillo realizar modificaciones.

De tal forma que ahora dispondremos de al menos dos ficheros en la nueva solución .El primero almacena los beans de Spring y el segundo configura los parametros. De esta manera nos será mucho mas sencillo realizar modificaciones. Vamos a ver como quedan configurados estos ficheros.

contexto.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" xmlns:context="http://www.springframework.com/schema/context"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context-3.2.xsd">

<bean
 class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
 <value>servicio.properties</value>
 </property>
 </bean>

<bean id="servicioPropiedades" class="com.arquitecturajava.properties.Servicio">
 <property name="url" value="${url}"></property>
 <property name="puerto" value="${puerto}"></property>
 </bean>

</beans>

El bean PropertyPlaceholderConfigurer se encarga de extraer los parámetros de configuración a un fichero properties . Una vez realizada esta operación podemos ligar las propiedades a nuestro bien a través de la expresión ${url} o ${puerto} por último mostramos el contenido del fichero servicio.properties

url=http://tomcat
puerto=8081

Una vez realizada esta operación las responsabilidades de desarrollador y administrador quedarán mucho mas separadas.

About Cecilio Álvarez Caules

Cecilio Álvarez Caules Sun Certified Enterprise Architech (J2EE/JEE).

19 Responses to Spring y PropertyPlaceHolderConfigurer

  1. David 22 mayo, 2013 at 14:14 #

    Esta es una muy buena y recomendable técnica, no sólo por la separación de responsabilidades del desarrollador y el administrador, sino también porque bajo mi punto de vista es más fácil y cómodo de mantener así, teniendo en un properties aparte los valores susceptibles de ser modificados.
    Además así el fichero de contexto no se modifica, y tendrás menos posibilidades de cometer errores de tecleo en él.

    • Cecilio Álvarez Caules 26 mayo, 2013 at 18:30 #

      asi es

  2. Mintakastar 22 mayo, 2013 at 18:21 #

    Ahora entiendo, por que no jalaban esa sintaxis {port}, para algunas cosas en Jboss, supongo que esos valores estaban en otros archivos, como este de Spring.

    Buena solucion para separar la administracion de parametros, de los archivos de configuracion del framework.

    • Cecilio Álvarez Caules 26 mayo, 2013 at 18:30 #

      espero te sea util

  3. jorge 10 julio, 2013 at 20:57 #

    hola, muy buena entrada. mi pregunta es como configurar esta solución cuando los ficheros de condifugración deben estar fuera del war.

    • Cecilio Álvarez Caules 20 julio, 2013 at 9:09 #

      Bueno en ese caso tendras que definir alguna ruta absoluta . A los administradores de sistemas esto les suele encajar .No deberías tener mayores problemas ya que spring lo soporta

  4. jorge 10 julio, 2013 at 20:57 #

    hola, muy buena entrada. mi pregunta es como configurar esta solución cuando los ficheros de configuración deben estar fuera del war.

    • Cecilio Álvarez Caules 1 agosto, 2013 at 6:52 #

      En principio te tendría que valer asignar una ruta absoluta . Esta ruta absoluta hay administradores que luego la parametrizan a traves de propiedades a nivel de arranque de la maquina virtual.

  5. Marta 24 noviembre, 2015 at 18:31 #

    Buenas,

    Gracias por la información, me gustaría saber cómo llamar desde el XML de configuración de Spring a un archivo properties que no está en la carpeta main/resources, si no que está en src/etc/…/archivo.properties.

    No consigo que lo cargue el contexto de aplicación.

    Gracias, un saludo

  6. Orlando 11 diciembre, 2015 at 6:01 #

    Saludos muy buen aporte, pero tengo una duda, soy algo nuevo usando spring y log4j mi pregunta es la siguiente, estoy implementando un listener en el que hago un System.setProperty(“valor”,”valorPropiedad ruta del directrio”); y deseo introducirlo en mi fichero aplicationContext.xml como algo parecido ${valor}archivo.log

    el punto es que luego de implementar esta solucion y ejecutar la aplicacion web usando weblogic se crea mi archivo de salida con el siguiente nombre : ${valor}archivo.log

    es decir la propiedad ${valor} no esta tomando la ruta donde deseo que se genere mi archivo he investigado intensamente y no he logrado con la solución saben de como puedo solventar esto sin usar un archivo.properties

  7. Osmay 7 marzo, 2016 at 22:35 #

    Hola Celcilio, me he convertido en fiel seguidor de su blog. Hace un tiempo comencé a utilizar Spring y leyendo este artículo me surge una duda: Es posible a través del sitio web modificar los parámetros guardados en un .properties y luego guardar el archivo con la modificación hecha?
    Saludos y gracias por sus aportes.

    • Cecilio Álvarez Caules 8 marzo, 2016 at 12:08 #

      Yo creo que para hacer una modificación en caliente de Spring lo más practico es usar Spring jmx , que te permite acceso remoto

Trackbacks/Pingbacks

  1. Spring Framework y aislamiento - Arquitectura Java - 28 junio, 2015

    […] Otros Artículos relacionados: Spring y Responsabilidades , Spring PropertyPlaceHolder […]

  2. Utilizando Spring Profiles - Arquitectura Java - 26 agosto, 2015

    […] artículos relacionados: Spring PropertyPlaceHoldersConfigurar, Spring responsabilidad y […]

  3. ¿Qué es SpringBoot? - Arquitectura Java - 8 marzo, 2016

    […] artículos relacionados:  PropertiesPlaceHolder , SpringConfiguration , Spring […]

  4. ¿Qué es Spring Boot? - Arquitectura Java - 31 marzo, 2016

    […] artículos relacionados:  PropertiesPlaceHolder , SpringConfiguration , Spring […]

  5. Spring Anotaciones vs XML - Arquitectura Java - 10 enero, 2017

    […] Artículos relacionados: SpringPropertyPlaceConfigurer, Spring […]

Deja un comentario

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies