Cargar ficheros Properties en Spring

Hay  veces que nos gustaria tener la aplicacion configurada para que cogiera ciertos valores al arrancar de un fichero properties  o de un xml, etc... vamos, de algun archivo externo, de forma que si queremos cambiar algun parametro de la aplicacion no haya que volver a compilarla.

Por ejemplo, si nuestra aplicacion conecta con una bbbdd mediante hibernate o Jpa, pues sabemos que nuestro fichero persistence.xml estara dentro del war y si queremos cambiar la conexion de la bbdd, debemos cambiarlo en el persistence y volver a generar el war....vamos un rollo....

Spring nos permite expecificar ficheros properties o xml que tomara en cuenta cuando arranque y las cargara en el classpath, de forma que podamos referenciarlas en cualquier archivo interno de la aplicacion.

La libreria de Spring ofrece un bean preparado para estas cosas, asi que lo unico que tenemos es que expecificar en nuestro fichero de configuracion de Spring (applicationContext.xml) un nuevo bean del tipo "org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"

Este bean tiene una propiedad de tipo list llamada "locations" en la que le expecificaremos los archivos que debe tener en cuenta. La historia quedara algo asi:

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" id="propertyPlaceholder" init-method="init">
        <property name="locations">
            <list>
                <value>classpath*:/META-INF/spring/*.properties</value>
                 <value>classpath*:/META-INF/spring/ehcahe.xml</value>
            </list>
        </property>
    </bean>

Al arrancar el contexto, Spring instanciara ese bean "propertyPlaceholder" y este metera en el classpath los archivos pasados. (Si te fijas, acepta caracteres comodin * y cosas asi).

Ahora para referenciar estas propiedades en otros archivos, se hace de la forma comun ${nombrePropiedad}

Asi , por ejemplo, si definimos un archivo properties con la conexion de la bbdd parecido a esto:

#Properties para la bbdd
database.password=mypassword
database.url=jdbc\:oracle\:thin\:@ora\:1981\:schema1
database.username=myName
database.driverClassName=oracle.jdbc.OracleDriver
database.schema=schema1

Si queremos referenciarlo en el persitence.xml, quedara de esta manera:

<property name="hibernate.connection.username" value="${database.username}"/>
<property name="hibernate.connection.password" value="${database.password}"/>
<property name="hibernate.connection.url" value="${database.url}"/>
<property name="hibernate.connection.driver_class" value="${database.driverClassName}"/>


La verdad, tiene muchas ventajas, tener la configuracion externalizada de la aplicacion.

Comparte, que es un arte!!

Comentarios

  1. Una consulta Daniel, como sería el tratamiento en el caso que quiera acceder a algunos de los properties, definidos con el propertyPlaceholder, desde una clase (por ejemplo un servicio se Spring).

    Podría ser inyectando propertyPlaceholder? justo estoy en ese lío =S, agradecería tu ayuda.

    ResponderEliminar
  2. Puedes acceder a ficheros estaticos detro del classpath de tu aplicacion a traves de :

    InputStream stream = myclass.class.getResourceAsStream("resources/config/properties.file");

    En este post explican distintas maneras, espero que te sirva.
    http://stackoverflow.com/questions/676250/different-ways-of-loading-a-file-as-an-inputstream.

    Lo que me comentas de inyectar el propertyPlaceholder...pues no lo se, no lo he probado la verdad.... pero el modo mas habitual de acceder un fichero estatico en el classpath suele ser con getResourceAsStream y metodos de ese estilo.
    espero que te sirva!!

    ResponderEliminar

Publicar un comentario

Entradas populares de este blog

Subir campos Blob a BBDD (Oracle) con Java

Reiniciar usuario de SVN Subversion

Cucumber y Java - definiendo test de una manera amigable