@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ści. Programista nie musi ręcznie dokonywać rzutowania lecz mechanizm Spring Boot dokonuje tego w sposób automatyczny. Rezultat przekładu widoczny poniżej:
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; }
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); }
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
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.