[Spring Tip] Utilizzare l'annotazione @Value
Tra la miriade di strumenti che Spring ci mette a disposizione, c’è una simpatica Java annotation che vale sicuramente la pena di conoscere: si chiama @Value
e permette di sfruttare la dependency injection anche con i valori presenti nei nostri file .properties
(… ma non solo).
Vediamola all’opera…
@Value in azione
Il modo più semplice per utilizzare l’annotazione @Value
è applicarla a livello di campo:
@Value("${application.test.property}")
private String testProp;
Il codice appena riportato inietterà il valore della property application.test.property
nella variabile testProp
.
Due osservazioni:
- l’injection tramite
@Value
funziona solo per classi gestite dallo IoC container di Spring (esattamente come per@Autowired
); - non confondete la sintassi
${application.test.property}
conapplication.test.property
: la prima permette di ottenere il valore della property, la seconda valorizza semplicemente la variabiletestProp
con la stringa"application.test.property"
.
Importare le properties
L’annotazione @Value
viene spesso utilizzata in accoppiata con un’altra annotazione di Spring: @PropertySource
.
Benché sia possibile definire le nostre proprietà in application.properties
, questo file dovrebbe essere utilizzato solo per i parametri strettamente legati a Spring Boot.
Per caricare le nostre custom properties possiamo invece fare qualcosa del genere:
@Configuration
@PropertySource("classpath:other.properties")
public class SimpleConfiguration {
@Bean
StringBuilder nameBuilder(@Value("${other.prop.name}") String name) {
return new StringBuilder("Ciao " + name);
}
}
L’annotazione @PropertySource
può essere applicata a qualunque classe di configurazione all’interno del nostro progetto Spring e permette di specifica quali file .properties
includere nell’environment della nostra applicazione.
Come vedete possiamo utilizzare @Value
(a livello di parametro) anche per la definizione dei bean all’interno della nostra classe di configurazione. Le proprietà contenute in other.properties
ed “importate” tramite @PropertySource
saranno comunque accessibili da qualunque classe all’interno del nostro progetto.
Valori di default e system properties
Un’altra caratteristica interessante dell’annotazione @Value
è la possibilità di prevedere dei valori di default per le proprietà non definite:
@Value("${absent.int.prop:0}")
private int intProp;
Possiamo specificare il valore predefinito da assegnare dopo i due punti: nome.prop:valore di default
.
Piccola nota Non bisogna confondere le properties
non definite (assenti) con quelle senza un valore assegnato: my.prop=
. Queste ultime avranno semplicemente valore ""
.
L’annotazione @Value
può essere utilizzata anche per recuperare il valore delle proprietà di sistema, specificate tramite l’opzione -D
:
java -D<nome>=<valore> -jar app.jar
Nota Le system properties hanno precedenza sulle proprietà definite nei file .properties
, per cui se abbiamo definito una proprietà di sistema con lo stesso nome di una proprietà presente in un file, verrà “pescato” il valore della prima.
In conclusione
In questo post abbiamo visto come utilizzare le annotazioni @Value
e @PropertySource
per recuperare i valori delle properties nei nostri progetti Spring.
Alla prossima,
David