domingo, 5 de marzo de 2017

En algunas ocasiones será necesario guardar información en archivos que se encuentren en el classpath, el sistema de archivos, por ejemplo, es usual crear un archivo llamado application.properties donde se almacenan datos de configuración de la aplicación, como los  datos de conexión a la base de datos, entre otras cosas, Spring nos facilita esta tarea con la anotación @PropertySource.

La anotación @PropertySource nos provee de una interface que permite la carga del contenido de los archivos de propiedades, estos contienen información tipo clave/valor y usualmente tienen la extensión .properties.

Antes de comenzar debemos crear un bean de tipo PropertySourcesPlaceholderConfigurer encargado de configurar esta funcionalidad y además tenemos que agregar la anotación @PropertySource("classpath:application.properties") donde indicamos cual es el archivo que contiene las datos que deseamos leer, en este caso leeremos el archivo llamado application.properties que se encuentra en el classpath:, podemos usa file: para indicar una ruta al sistema de archivos.

En Netbeans 8.x podemos crear el archivo de propiedades en el menú contextual de proyecto, en la opción New / Properties File…

archivo de propiedades en spring

Seguido indicamos el nombre del archivo y la carpeta donde se guardará, src\main\resources la raíz del classpath de nuestro proyecto.

image

Ahora tenemos que agregar contenido al archivo que acabamos de crear, el formato es clave/valor, primero indicamos la clave seguido del valor de la misma, para separar podemos usar “:” o “=”.

mensaje: Hello Spring Framework
autor= Tutor de programación

La configuración desde código Java queda de la siguiente manera:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;

@Configuration
@PropertySource("classpath:application.properties")
public class SpringConfiguration {

    @Value("${autor}")
    private String mensaje;
    
    @Bean
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }

    @Bean
    public HelloService saludaService() {
        return new HelloServiceImpl(mensaje);
    }
}

Analizando el código veremos @Value("${autor}") esta es la anotación usada para obtener el valor de la clave indicada, en este caso obtenernos la cadena de texto asociada a la clave autor y lo almacenamos en la variable mensaje.

Si deseamos cargar un archivo en disco: @PropertySource("file:c/temp/app.properties").

La configuración equivalente en XML es la siguiente:

<bean id="discountPropertyConfigurer"
      class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
    <property name="location">
        <value>classpath:application.properties</value>
    </property>
</bean>

<bean id="saludaService" class="carmelo.spring.introduccion.HelloServiceImpl">
    <constructor-arg value="${mensaje}"/>
</bean>

Otra forma mas corta de hacerlo es la siguiente:

<context:property-placeholder location="classpath:application.properties"/>

<bean id="saludaService" class="carmelo.spring.introduccion.HelloServiceImpl">
    <constructor-arg value="${mensaje}"/>
</bean>

Usamos la primero si deseamos tener mas control sobre la configuración.

Ya sea en XML o código Java usamos "${...}" con el nombre de la clave, el valor de dicha clave será colocado aquí.

También es posible cargar archivos de todo tipo como archivos de texto, imágenes, audio, etc., en este caso el tipo de datos debe ser Resource este nos permite obtener un InputStream que usamos para leer el archivo, para este ejemplo creamos un archivo HTML, veamos como leerlo.

@Value("${classpath:web/index.html}")
private Resource page;

@Bean
public HelloService saludaService() throws IOException {

    BufferedReader br = new BufferedReader(new FileReader(page.getFile()));
    String msg = br.lines().collect(Collectors.joining(System.lineSeparator()));

    return new HelloServiceImpl(msg);
}

En esta ocasión "${...}" apunta directamente al archivo deseado y no a una clave de un archivo de propiedades como en los ejemplos anteriores.

La anotación @Value("${classpath:web/index.html}") carga el archivo indicado, usamos page.getFile() para leer el contenido del archivo en modo texto, pudimos haber usado page.getInputStream() para obtener el InputStream y crear una imagen, por ejemplo.

leer archivo con spring

Ver código en GitHub: Spring Externalizar Propiedades

Ver más tutoriales en: Tutoriales Spring Framework

0 comentarios :

Publicar un comentario