Immagine descrittiva del post

In questo articolo scoprirai come recuperare e leggere le proprietà dell’applicazione definite nel file application.yml (o application.properties) di un progetto Spring Boot, e come utilizzarle all’interno di un componente.

Come esempio, andiamo a leggere le proprietà propNumber e propText definite nel file application.yml cosi definite:

custom: 
    example: 
        propNumber: 12345 
        propText: text

Analogamente per il file application.properties:

custom.example.propNumber=12345 
custom.example.propText=text
 

Gli strumenti per leggere le proprietà dell'applicazione

Come promesso, di seguito, i modi per leggere le proprietà dell’applicazione in Spring Boot.

 

Utilizzare l'annotazione @Value

Un modo per leggere le proprietà dell’applicazione, e quindi il suo valore, è tramite l’annotazione @Value.

Basta inserire l’annotazione subito sopra l’attributo della classe da valorizzare specificando la dichiarazione (il percorso all’interno del file properties/yml) della proprietà dentro @Value() con la sintassi ${}.

@Component 
public class ClassService { 

    @Value("${custom.example.propNumber}") 
    private int propN; 
    
    @Value("${custom.example.propText}") 
    private String propT; 
    
    ...
}

È possibile utilizzare l’annotazione @Value tra i parametri di un metodo, ad esempio nel costruttore della classe:

@Component
public class ClassService {

    private int propN; 
    
    public ClassService(@Value("${custom.example.propNumber}") int propN) { 
        this.propN = propN; 
    }
    
}
 

Leggere array o liste di elementi

Una proprietà può essere dichiara come una successione di elementi separati da virgola (sintassi di default per Spring), oppure assegnando valori diversi alla stessa proprietà.

custom.example.listEl = a,b,c

custom.example.listEl = a
custom.example.listEl = b
custom.example.listEl = c

Per entrambe le modalità viste, possiamo leggere il valore della proprietà all’interno del componente tramite l’annotazione @Value vista poco fa. Il tipo di dato aspettato potrà essere una lista oppure un array.

@Value("${custom.example.listEl}") 
private List listEl; 

@Value("${custom.example.listEl}") 
private String[] listEl;
 

Expression

L’annotazione @Value permette l’utilizzo di espressioni tramite la sintassi #{..}.

@Value("#{${custom.example.listEl}}") 
private List listEl;

Una Expression permette di eseguire operazioni nella lettura delle proprietà. Avremmo potuto dichiarare la proprietà listEl utilizzando una sintassi personalizzata sostituendo le virgole con altri caratteri, ad esempio ‘;’

custom.example.listEl = a;b;c;

Utilizzando il metodo .split() all’interno di un’espressione possiamo ottenere il risultato precedente:

@Value("#{'${custom.example.listEl}'.split(';')}") 
private List listEl;
 

Leggere una mappa di valori

Con le Expression è possibile dichiarare attributi hashmap senza incombere in eccezioni come IllegalStateException, specificando tra parentesi graffe le coppie chiave-valore separate da virgola, come nell’esempio:

custom.example.mapEl={a:1, b:2, c:3}
@Value("#{${custom.example.mapEl}}") 
Map<String, Integer> mapEl;
 

Utilizzare l'annotazione di classe @ConfigurationProperties

Un modo efficace, soprattutto quando si vuole assegnare il valore di molti attributi, è quello di utilizzare l’annotazione @ConfigurationProperties a livello di classe.

@Component 
@ConfigurationProperties(prefix = "custom.example") 
public class ClassService { 
    
    private int propNumber; 
    private String propString; 
    
    public int getPropNumber() { 
        return propNumber; 
    } 
    
    public void setPropNumber(int propNumber) { 
        this.propNumber = propNumber; 
    } 
    
    public String getPropString() { 
        return propString; 
    } 
    
    public void setPropString(String propString) { 
        this.propString = propString; 
    } 
}

Per fare questo, è necessario seguire alcune regole

  • specificare le proprietà sotto lo stesso prefisso (come nell’esempio: custom.example)
  • i nomi degli attributi della classe devono avere lo stesso nome delle proprietà (propNumber, propText)
  • devono essere presenti i corrispettivi metodi getter e setter
 

Utilizzare l'interfaccia Environment

Abbiamo visto come sia possibile ottenere il valore delle proprietà attraverso le annotazioni @Value e @ConfigurationProperties.

Un altro modo per ottenere lo stesso risultato è quello di utilizzare l’interfaccia Environment, iniettandola all’interno della classe:

@Component 
public class ClassService { 
    
    @Autowired 
    private Environment env; 
    
    private int propNumber; 
    private String propString; 
    
    public ClassService() { 
        this.propNumber = env.getProperty("custom.example.propNumber", Integer.class); 
        this.propString = env.getProperty("custom.example.propText"); 
    } 
}

Nel caso in cui non si tratta di una String, occorre specificare tra gli argomenti il tipo di dato (es. Integer.class).

 

Prossimo step

In questo articolo hai visto come leggere le proprietà di un’applicazione Spring Boot, ma è solo una delle potenzialità che offre il framework per lo sviluppo di applicazioni server. In questo sito puoi trovare altri esempi su Spring Boot, ad esempio come comunicare con il database in un’applicazione Spring Boot.

Recommended Posts

No comment yet, add your voice below!


Add a Comment

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *