w , ,

FajneFajne ŚwietnieŚwietnie

Spring Boot część 8 – wyczytywanie konfiguracji przy użyciu adnotacji @Value

Spring Boot

@Value – adnotacja umożliwiająca wstrzykiwanie wartości. Umożliwia również przekazywanie wartości domyślnych.

Z wykorzystaniem adnotacji @Value można wyczytywać wartości zapisane w pliku konfiguracyjnym. Domyślny plik konfiguracyjny dla SpringBoot jest automatycznie tworzony i nazywa się application.properties.

Podstawowe wczytywanie wartości

Plik konfiguracyjny przyjmuje konstrukcje:
klucz1=wartość1
klucz2=wartość2
Po kluczu programista odwołuje się do wartości jaką umieścił w pliku konfiguracyjnym.

Przykładowo plik application.properties może mieć następujące wpisy:

1myConfigReader.exampleString=hello!
2myConfigReader.exampleNumber=4
3myConfigReader.exampleTrueOrFalse=true

Nie ma znaczenia jaką budowę będzie miał klucz. Lecz dobrą praktyką jest napisanie go małymi literami. Pierwszy człon powinien być nazwą klasy + kropka + nazwa zmiennej do której będzie wczytywana wartość.

W tym przykładzie nazwą dla kasy jest myConfigReader a dla pola exampleString

1myConfigReader.exampleString

Aby zaczytać konfiguracje do pola klasy wystarczy posłużyć się adnotacją @Value. @Value przyjmuje w parametrze „${klucz.do.przyjmowanej.wartości}”.

Umieszczenie tej adnotacji nad polem spowoduje wstrzyknięcie wartości do zmiennej.

1@RestController
2public class MyConfigReader {
3 
4    @Value("${myConfigReader.exampleString}")
5    public String exampleString;
6 
7    @Value("${myConfigReader.exampleNumber}")
8    public int exampleNumber;
9 
10    @Value("${myConfigReader.exampleTrueOrFalse}")
11    public boolean exampleTrueOrFalse;
12 
13    @RequestMapping("/checkConfig")
14    public String checkConfig() {
15        return "String from config: " + exampleString +
16               " Number from config: " + exampleNumber +
17               " Boolean from config: " + exampleTrueOrFalse;
18    }
19}

 

Zaletą mechanizmu wstrzykiwania wartości jest automatyczne konwertowanie wartościProgramista nie musi ręcznie dokonywać rzutowania lecz mechanizm Spring Boot dokonuje tego w sposób automatyczny. Rezultat przekładu widoczny poniżej:

 

wczytywanie Konfiguracji Spring

Przekazywanie wartości domyślnych

Dopuszczalne jest definiowanie wartości domyślnych. Oznacza, to, że jeśli kontekst Spring nie znajdzie w pliku konfiguracyjnym zdefiniowanej zmiennej, to do pola wstrzyknie wartość domyślną. Wartość domyślną definiuje się wewnątrz adnotacji @Value po dwukropku – tak jak widać to na przykładzie poniższym. W przypadku ciągu tekstowego nie umieszcza się go dodatkowo w cudzysłowie.

1@Value("${myConfigReader.noExistingString:undefined value}")
2private String undefinedString;
3 
4@Value("${myConfigReader.noExistingInt:0}")
5private int undefinedNumber;
6 
7@RequestMapping("/checkConfig2")
8public String checkConfig2() {
9    return undefinedString + " AND " + undefinedNumber;
10}

 

Wczytywanie wartości domyślnej

Przekazywanie kolekcji

Aby wczytać dane to tablicy wystarczy w pliku konfiguracyjnym do zmiennej przypisać wartości oddzielone przecinkami:

1myConfigReader.array=S,P,R,I,N,G

W kodzie programu postępujemy zgodnie z ogólnymi zasadami.

1@Value("${myConfigReader.array}")
2private String[] exampleArray;
3 
4@RequestMapping("/checkConfig3")
5public String checkConfig3() {
6    return Arrays.toString(exampleArray);
7}

 

wczytywanie tablic

Sprawa komplikuje się w przypadku umieszczenia danych w liście. Postępując standardowo do listy zostanie przypisany tylko jeden element. Rozwiązaniem jest wykorzystanie Spring Expression Language (SpEL). 

1@Value("#{'${myConfigReader.array}'.split(',')}")
2   private List<String> exampleList;
3 
4   @RequestMapping("/checkConfig4")
5   public String checkConfig4() {
6       return exampleList.toString();
7   }

Zastosowanie SpEL i metody split można osiągnąć efekt, że każdemu elementowi oddzielonemu przecinkiem zostanie przypisany oddzielny indeks w liście

 

wczytywanie listy

 

Wnioski

Z wykorzystaniem adnotacji @Value można wstrzykiwać wartości do pól. Przekazywać można tak obiekty, typy proste, tablice czy listy. @Autowired w przeciwieństwie do @Value pozwala tylko na wstrzykiwanie obiektów zarządzanych przed Contexts and Dependency Injection.

W kolejnej części opisany zostanie sposób automatycznego wczytywania konfiguracji do klasy.

Cały kurs opisujący mechanikę i działanie Spring Boot od podstaw znajdziesz tutaj: Kurs Spring Boot

Napisane przez Przemysław Bykowski

Aktywny programista i energiczny trener. Specjalizuje się w Spring Boot i uczę go w ramach AkademiaSpring.pl. Po godzinach udzielam się na YouTubach. Więcej o mnie.

Dodaj komentarz

Spring Boot

Spring Boot część 7 – Niejawne przekazanie argumentów do metody kontrolera

Spring Boot

Spring Boot część 9 – Automatyczne wczytanie konfiguracji