W projektach opartych o Spring Boot korzystamy z mechanizmu konfiguracyjnego, który jest podstawowym elementem bazowej wersji Springa (takiej, w której nie używamy Spring Boota).
Konfiguracja jest więc zwyczajowo przechowywana w plikach o nazwach
application.properties albo
application.yml,
znajdujących się w
src/main/resources lub
src/test/resources (dla testów) . Pliki te różnią się formatem przechowywania
danych.
Pliki *.properties vs *.yml
Plik
application.properties przechowuje dane w postaci powiązania klucz - wartość:
Plik
application.yml przechowuje dane w postaci hierarchicznej:
Z założenia pliki w formacie YAML (yml) są bardziej "human readable" i tak też prezentuje się powyższy przykład. Nam jednak bardziej podoba się stara, kompaktowa wersja, w
postaci pliku properties. Co kto lubi.
Niemniej trzeba zwrócić uwagę na to, że obecnie panuje moda na YAML-a i bardzo często konfiguracje w oficjalnych dokumentacjach (np. OAuth2 dla Google'a) przedstawiane są właśnie w tym formacie.
Warto się z nim zaprzyjaźnić.
Profile w konfiguracji
Należy pamiętać, że pliki konfiguracyjne mogą być tworzone osobno dla każdego środowiska. Zatem jeśli mamy np. środowisko DEV i PROD, wówczas
zwykle tworzymy taki zestaw plików:
application-DEV.properties
application-PROD.properties
application.properties
Dodatkowo warto jeszcze wprowadzić plik, który będzie używany w przypadku lokalnej konfiguracji na własnej maszynie dev.:
application-LOCAL.properties
Oczywiście takie pliki będą ładowane zgodnie z ustawionym profilem Springa.
Zatem, jeśli teraz na przykład ustawimy zmienną (argument JVM) podczas uruchamiania aplikacji:
-Dspring.profiles.active=DEV
wówczas zaczytana zostanie konfiguracja w kolejności z plików:
application-DEV.properties
application.properties
Więc najpierw plik dedykowany dla środowiska, a następnie plik ogólny.
Jeśli plik dedykowany posiada ten sam klucz co plik ogólny, to wtedy ta wartość nadpisze wartość z pliku ogólnego.
Jeśli w pliku dedykowanym mamy ustawioną własność
server.port=8089, a w pliku ogólnym
server.port=8080, to wówczas własność ta przyjmie wartość 8089.
Appa Notka. Zobacz jak możesz skonfigurować alternatywne połączenie do bazy korzystając z profilu w Springu.
Na filmie podłączamy bazę danych Postgres do projektu, który domyślnie używa bazy H2.
W celu obejrzenia filmu na pełnym ekranie, kliknij w ikonę Youtube podczas oglądania filmu.
Własność spring.profile.active
Aktywny profile (bądź profile) w Springu możemy ustawiać na kilka różnych sposobów:
- Interfejs SpringBootServletInitializer lub bezpośrednio WebApplicationInitializer (rozszerza tego pierwszego):
- Interfejs ConfigurableEnvironment - rzadko używany ze względu na mnogość innych bardziej popularnych opcji:
- Argument maszyny wirtualnej (JVM) - w Eclipsach ustawiamy: Run As > Run Configurations... > Arguments > VM arguments...
Może też być ustawiany z poziomu linii komend lub jako parametr podany w trakcie uruchomiania Tomcata.
- Zmienna środowiskowa - zwracamy uwagę, że w tym przypadku zamiast kropek wstawiamy podkreślenia:
- Profil Mavena - w tym przypadku naszym celem będzie podmiana placeholdera (z małpą), który wcześniej musimy dodać do pliku application.properties -
spring.profiles.active=@spring.profiles.active@:
Należy również pamiętać o włączeniu filtrowania zasobów (aby mogła się udać podmiana placeholdera):
W powyższych przykładach używaliśmy tylko jednego profilu, ale w ten sam sposób można ustawiać kilka profilów na raz. Na przykład możemy chcieć
aby zaczytana została konfiguracja zarówno dla naszego środowiska lokalnego, jak i środowiska deweloperskiego:
Adnotacja @Profile
Korzystając z wyżej wymienionych profili możemy spowodować, że nasze klasy będą ładowane tylko dla określonego profilu. W tym celu wystarczy, że podczas
tworzenia klasy użyjemy adnotacji
@Profile:
Uwzględniając to, że adnotacja przyjmuje tablicę stringów, możemy określić kilka profilów, dla których dana klasa ma być załadowana:
Podstawowe własności konfiguracyjne
Wracając do Spring Boota, spójrzmy teraz na
subiektywną listę popularnych własności konfiguracyjnych wraz z opisami:
Oczywiście oryginalna lista własności konfiguracyjnych jest dużo, ale to naprawdę dużo dłuższa, niż ta przedstawiona w bieżącym rozdziale,
dlatego zachęcamy do odwiedzenia linka podanego na dole strony, który prowadzi bezpośrednio do dokumentacji Springa zawierającej całą listę.
Nasza rekomendacja
Konfiguracja YAML jest bardzo popularna i powszechnie stosowana w projektach działających w architekturze mikrousług (microservices).
Jakoś tak się dzieje, że w przypadku klasycznych aplikacji webowych częściej spotykamy konfiguracje oparte na plikach properties.
Nic nie stoi również na przeszkodzie, aby używać obu plików w jednocześnie.
Wtedy część konfiguracji, która jest typowa dla YAML-a (np. OAuth2) może być przechowywana w pliku yml, a pozostała część w pliku properties.
Podoba nam się takie podejście. Niemniej nie powinniśmy generalizować. Wszystko zależy w dużej mierze od ustaleń osób pracujących w projekcie, szczególnie jeśli jest to samoorganizujący się zespół scrumowy.
Używamy w StartAPPa
Wszystkie nasze kursy zawierają odpowiednio skonfigurowane pliki properties.
W niektórych plikach używamy również nasze własne zmienne konfiguracyjne,
np. ścieżki, w których są przechowywane zdjęcia w aplikacji webowej,
albo konfigurację konta pocztowego do wysyłania maili. Wszystko to jest częścią aplikacji w ramach Kursu Aplikacji Web - Mega pakiet.
Z profilów korzystamy, ale tylko aby lokalnie rozróżnić wersje klas między tymi, które są używane w ramach aplikacji dostępnej online a tymi, które są
udostępniane w niezależnych modułach (do ściągnięcia). Wynika to z tego, że mając kilka mniejszych aplikacji złączonych w jedną, niektóre
klasy muszą być przez nas wyłączone z użycia, aby nie duplikowały się ich funkcjonalności. Dotyczy to w szczególności klas konfiguracyjnych.
Linki
https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html