[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:

  1. l’injection tramite @Value funziona solo per classi gestite dallo IoC container di Spring (esattamente come per @Autowired);
  2. non confondete la sintassi ${application.test.property} con application.test.property: la prima permette di ottenere il valore della property, la seconda valorizza semplicemente la variabile testProp 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