Spring 4 e le Properties

Ecco due modalità con cui è possibile interagire con le proprietà contenute nei file .properties. Le modalità sono:

  • Il bean PropertyPlaceholderConfigurer
  • Il tag util:properties

Utilizzando il bean PropertyPlaceholderConfigurer

Utilizzando questo bean è possibile rendere disponibile agli altri bean in fase di configurazione e alle classi java le proprietà contenute nei file di configurazione.
Supponiamo di avere il file db.properties con le proprietà:

db.driverClassName=com.mysql.jdbc.Driver
db.url=jdbc:mysql://127.0.0.1/cms2?zeroDateTimeBehavior=convertToNull
db.username=root
db.password=superpippo

che si trova alla radice della cartella delle risorse (in maven: src/main/resources). La definione del bean è la seguente:

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

A questo punto, utilizzando le Spring Expression Language (SpEL) possiamo rendere disponibili le proprietà alla definizione degli altri beans in questo modo:

<bean id="unServizio" class="nicola.esempi.UnServizioImpl" >
	<property name="username" value="${db.username}" />
	<property name="password" value="${db.password}" />
</bean>

Per assegnare ad una variabile il valore di una proprietà possiamo:

  • Utilizzare l’annotazione @Value
  • fornire di un set la variabile ed iniettarne il valore da configurazione

Per utilizzare l’annotazione @Value è sufficiente definire la variabile in questo modo:

@Value( "${db.driverClassName}" )	
private String driverClassName;
 
@Value( "${db.url}" )	
private String url;

Per iniettarla da configurazione invece:

<property name="username" value="${db.username}" />
private String username;
public void setUsername(String username) {
	this.username = username;
}

Utilizzando il tag util:properties

Per gestire un file properties utilizzando questo tag è sufficiente scrivere così:

<beans xmlns:util="http://www.springframework.org/schema/util"
	si:schemaLocation=
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
 
<util:properties id="proprieta" location="classpath:app.properties" />

Il file properties è il seguente:

flag1=true
flag2=false
data=25/04/1972
importoDecimale=150.50
importoIntero=150
stringa=pippo

Posso utilizzare l’annotazione @Value per caricare il valore di una singola proprietà ad una variabile. Se i tipi di dato sono coerenti il cast avviene in automatico. Utilizzando il file come descritto sopra posso scrivere:

@Value("#{proprieta['flag1']}")
private boolean unFlag1;	
 
@Value("#{proprieta['flag2']}")
private boolean unFlag2;	
 
@Value("#{proprieta['data']}")
private Date unaDatasbagliata;
 
@Value("#{new java.text.SimpleDateFormat('dd/MM/yyyy').parse(proprieta['data'])}")
private Date unaDataGiusta;	
 
@Value("#{proprieta['importoIntero']}")
private Integer unImportoInteger;
 
@Value("#{proprieta['importoDecimale']}")
private Double unImportoDouble;
 
@Value("#{proprieta['importoDecimale']}")
private Float unImportoFloat;
 
@Value("#{proprieta['stringa']}")
private String unaStringa;

L’unica cosa da notare è come viene gestito il tipo Date, che non viene convertito correttamente. All’interno del tag @Value è possibile specificare un parser per la proprietà che andiamo a leggere:

@Value("#{new java.text.SimpleDateFormat('dd/MM/yyyy').parse(proprieta['data'])}")

Per associare il file .properties con la una istanza della classe Properties è sufficiente scrivere così:

@Resource(name = "proprieta")
private Properties proprieta;

Versioni e Dipendenze

In questo esempi è utilizzato Spring alla versione 4.0.1-RELEASE. Questa l’unica dipendenza maven:

<properties>
	<spring.version>4.1.0.RELEASE</spring.version>
	<project.build.sourceEncoding>ISO-8859-1</project.build.sourceEncoding>
</properties>
 
<dependencies>
 
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-context</artifactId>
		<version>${spring.version}</version>
	</dependency>
 
</dependencies>

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>