Configurar beans con properties en Spring

De ChuWiki
Saltar a: navegación, buscar

Veamos aquí un ejemplo, con spring framework, de cómo leer ficheros de propiedades para inicializar los atributos de nuestro beans. Tienes el ejemplo completo en Github

Dependencia Maven

Para nuestro proyecto necesitamos spring-context.jar con todas sus dependencias. Una forma fácil de conseguirlo es usando maven y poniendo la siguiente dependencia

<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-context</artifactId>
   <version>4.3.3.RELEASE</version>
   <scope>compile</scope>
</dependency>

Instanciar PropertyPlaceholderConfigurer

La clase de spring que lee ficheros de propiedades y los hace accesibles en la inicialización de nuestros beans en PropertyPlaceholderConfigurer. Así que, por ejemplo, en el fichero de contexto de spring podemos instanciarla de la siguiente forma

	<bean
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<list>
			   <value>classpath:file1.properties</value>
			   <value>file:src/main/config/file2.properties</value>
			<value>file:#{systemProperties['aPath']}/file3.properties</value>
			</list>
		</property>
		<property name="ignoreUnresolvablePlaceholders" value="true" />
		<property name="ignoreResourceNotFound" value="true" />
	</bean>

Se instancia la clase como un bean cualquiera. Se fija su propiedad locations pasando una lista de localizaciones de ficheros de properties, tantas como queramos. En el ejemplo hemos puesto tres formas distintas:

  • Un fichero en el classpath.
  • Un fichero en un path relativo a nuestra aplicación. Si quisieramos un path absoluto, deberíamos poner file://path/abosulto/fichero.properties. En el caso de windows, suele ser buena idea añadir una barra adicional delante de la unidad de disco, así file:///C:/path/abosulto/fichero.properties
  • Un fichero en un path indicado por una variable de entorno aPath. Al no haber puesto las dos barras detrás de file, ese path será relativo o absoluto, según indique el contenido de la variable de entorno.

Hay dos propiedades más que fijamos a true

  • ignoreUnresolvablePlaceholders. Cuando más adelante rellenemos las propiedades de nuestro bean, por defecto saltará una excepción si alguna de las propiedades no se puede resolver. Poniendo esta propiedad a true, no saltará dicha excepción, sino que el bean se creará con el valor que tenga por defecto esa propiedad del bean (null, false, 0, ...)
  • ignoreResourceNotFound. Si PropertyPlaceholderConfigurer no encuentra alguno de los ficheros que le indicamos, por defecto salta una excepción. Con esta propiedad a true, se ignora el error y se continúa.

Al poner estas dos propiedades a true, puede que algunas propiedades de nuestros beans queden sin inicializar. No es problema si le damos un valor por defecto en la misma aplicación.

Fijar las propiedades del bean

Con anotaciones

En el bean que queremos instanciar y configurar, podemos poner anotaciones de la siguiente forma

package com.chuidiang.examples;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component("theBean")
public class OneBean {

   @Value("${string:default text}")
   private String aString;
   
   @Value("${int:-22}")
   private int aInt;
   
   @Value("${bool:true}")
   private boolean aBool;
   
}

Si en el fichero spring.xml de contexto ponemos que se busquen anotaciones para instanciar beans

<context:component-scan base-package="com.chuidiang.examples" />

podemos poner anotaciones en nuestras clases para que spring se encargue de buscarlas, instanciarlas e inicializarlas.

Con @Component("theBean") le decimos a spring que debe instanciar esta clase y darle el nombre "theBean" para poder buscarla luego.

En cuanto a la inicializacón, usamos la anotación con la siguiente sintaxis @Value("${nombrePropiedad:valorDefecto}"). En nuestro ejemplo

  • @Value("${string:default text}"). Se busca en los ficheros de propiedades una propiedad de nombre "string" y si la hay, se da su valor a nuestro atributo aString. Si no se encuentra, se le dará el valor por defecto "default text".
  • @Value("${int:-22}"). Similar al anterior, se busca una propiedad de nombre "int" y se asigna si existe su valor a aInt. Si no existe, se le pondrá por defecto el valor -22.
  • @Value("${bool:true}"). Más de lo mismo, pero con un boolean.

Sin anotaciones

Si no ponemos anotaciones, se puede hacer en el fichero spring.xml de contexto. Ahí se puede crear el bean e inicializar sus atributos con expresiones similares

	<bean class="com.chuidiang.examples.AnotherBean" name="anotherBean">
		<property name="anotherString" value="${string:default string}"/>
		<property name="anotherInt" value="${int:-22}"/>
		<property name="anotherBool" value="${bool:true}"/>
	</bean>

Es práctiamente igual que en el caso de anotaciones, sólo que en fichero XML. Los valores que se pasan son los mismos que se pasaban en las anotaciones, con la sintaxis ${nombrePropiedad:valorDefecto}.