w , ,

FajneFajne ŚwietnieŚwietnie

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

Spring Boot
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:

myConfigReader.exampleString=hello!
myConfigReader.exampleNumber=4
myConfigReader.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

myConfigReader.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.

@RestController
public class MyConfigReader {

    @Value("${myConfigReader.exampleString}")
    public String exampleString;

    @Value("${myConfigReader.exampleNumber}")
    public int exampleNumber;

    @Value("${myConfigReader.exampleTrueOrFalse}")
    public boolean exampleTrueOrFalse;

    @RequestMapping("/checkConfig")
    public String checkConfig() {
        return "String from config: " + exampleString +
               " Number from config: " + exampleNumber +
               " Boolean from config: " + exampleTrueOrFalse;
    }
}

 

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.

    @Value("${myConfigReader.noExistingString:undefined value}")
    private String undefinedString;
    
    @Value("${myConfigReader.noExistingInt:0}")
    private int undefinedNumber;
    
    @RequestMapping("/checkConfig2")
    public String checkConfig2() {
        return undefinedString + " AND " + undefinedNumber;
    }

 

Wczytywanie wartości domyślnej

Przekazywanie kolekcji

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

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

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

    @Value("${myConfigReader.array}")
    private String[] exampleArray;

    @RequestMapping("/checkConfig3")
    public String checkConfig3() {
        return Arrays.toString(exampleArray);
    }

 

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). 

 @Value("#{'${myConfigReader.array}'.split(',')}")
    private List<String> exampleList;

    @RequestMapping("/checkConfig4")
    public String checkConfig4() {
        return exampleList.toString();
    }

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