[Spring Tip] I profili di Spring e l'annotazione @Profile

Ogni applicazione, dalla fase iniziale di sviluppo alla messa in esercizio, trascorre differenti momenti della sua “vita” in diversi ambienti.

Ad esempio: solitamente, durante lo sviluppo, un’applicazione non viene agganciata al database di produzione (nel quale magari sono già presenti dati “reali” che non devono essere in alcun modo manipolati).

Oppure, in fase di test potrebbe essere utile creare degli oggetti fittizi (mock) che abbiano un comportamento “prevedibile”, così da poter verificare determinate funzionalità.

Infine, in fase di rilascio del software dovremo predisporre tutti i componenti e le configurazioni necessarie alla messa in esercizio.

Sarebbe utile avere un modo semplice per switchare tra differenti implementazioni e componenti specifici di ogni ambiente…

Per fortuna Spring ci ha pensato, definendo il concetto di profilo.

L’annotazione @Profile

Supponiamo dunque di aver definito differenti configurazioni o componenti in base all’ambiente in cui stiamo lavorando (anche se in realtà in concetto di profile non è necessariamente legato a quello di environment).

Possiamo sfruttare l’annotazione @Profile di Spring per associare un componente ad uno specifico profilo:

@Component
@Profile("production")
public class ProductionComponent  { ... }

Nell’esempio precedente abbiamo associato ProductionComponent al profilo production. In quello seguente, invece, esaminiamo il caso di una classe di configurazione:

@Configuration
@Profile({"profile1", "!profile2"})
public class CustomConfiguration  { ... }

L’annotazione @Profile permette di specificare un array di profili da valutare. In particolare è anche possibile indicare (usando l’operatore !) quali profili NON devono essere attivi affinché il componente venga istanziato dallo IoC Container.

L’ultimo esempio mostra invece come l’annotazione @Profile possa essere applicata anche a metodi @Bean all’interno di una classe @Configuration:

@Configuration
public class AnotherConfiguration  {
  @Bean
  @Profile("development")
  public SomeObject anObject() { ... }
}

Ma come facciamo ad impostare i profili attivi per la nostra applicazione Spring Boot?

Così…

Impostare i profili attivi

Iniziamo col dire che un’applicazione Spring per cui non sia stato impostato esplicitamente un profilo attivo utilizzerà il profilo (neanche a dirlo…) default. Nel log di avvio della notra applicazione (prime righe) troveremo qualcosa del tipo:

No active profile set, falling back to default profiles: default

In un’applicazione Spring Boot possiamo configurare i profili attivi nel file application.properties:

spring.profiles.active=development,test

o, in alternativa, specificando l’opzione spring.profiles.active se stiamo lanciando l’applicazione dalla linea di comando.

Inoltre nella classe principale del progetto, possiamo utilizzare il metodo setAdditionalProfiles di SpringApplication (prima d’invocare il run) per aggiungere ulteriori profili a quelli eventualmente definiti tramite properties.

In conclusione

I profili di Spring ci permettono di creare set di configurazioni che possiamo abilitare in base all’ambiente di lavoro o a specifiche esigenze del progetto.

Anche in questo caso, la dependency injection ci semplifica notevolmente la vita: possiamo switchare dai componenti di un profilo a quelli di un altro semplicemente valorizzando un parametro di configurazione.

Niente male, no?

A presto,

David