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