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.
[…] Artículos relacionados: SpringPropertyPlaceConfigurer, Spring […]
[…] artículos relacionados: PropertiesPlaceHolder , SpringConfiguration , Spring […]
[…] artículos relacionados: PropertiesPlaceHolder , SpringConfiguration , Spring […]
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.
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
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… Read more »
Spring es capaz de leer tambien una propiedad a nivel de sistema es decir una propiedad del entorno
http://www.summa-tech.com/blog/2009/04/20/6-tips-for-managing-property-files-with-spring
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
No deberias tener problemas poniendo una url absoluta sin embargo es posible que te sea más práctico pasar una variable de entorno http://stackoverflow.com/questions/3965446/how-to-read-system-environment-variable-in-spring-applicationcontext
[…] artículos relacionados: Spring PropertyPlaceHoldersConfigurar, Spring responsabilidad y […]
[…] Otros Artículos relacionados: Spring y Responsabilidades , Spring PropertyPlaceHolder […]
hola, muy buena entrada. mi pregunta es como configurar esta solución cuando los ficheros de configuración deben estar fuera del war.
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.
hola, muy buena entrada. mi pregunta es como configurar esta solución cuando los ficheros de condifugración deben estar fuera del war.
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
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.
espero te sea util
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.
asi es