Spring Boot, stosując podejście do konfiguracji oparte na rekomendowanych ustawieniach, umożliwia tworzenie
aplikacji przy minimalnym zestawie konfiguracji początkowych, jednocześnie pozostawiając przestrzeń na dostosowania
zgodnie z indywidualnymi potrzebami projektu.
Zwyczajowo konfiguracja jest 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:
Wybór między plikami
.properties a
.yml dla przechowywania
konfiguracji w Spring Boot zależy głównie od preferencji,
czytelności i złożoności konfiguracji.
Format
.yml (YAML) jest zazwyczaj bardziej czytelny, szczególnie przy
bardziej skomplikowanych ustawieniach z wieloma poziomami zagnieżdżenia. Dzięki wcięciom łatwiej jest przedstawić
hierarchię ustawień.
Z drugiej strony, format
.properties jest prostszy i może być bardziej przystępny dla mniej
złożonych konfiguracji, oferując tradycyjną strukturę klucz-wartość.
Warto zauważyć, że w nowych projektach Spring Boot często stosuje się format YAML ze względu na jego większą
elastyczność i czytelność przy zarządzaniu bardziej złożonymi konfiguracjami, choć wybór formatu wciąż pozostaje
kwestią preferencji zespołu deweloperskiego.
W niektórych przypadkach może być nawet sensowne stosowanie obu
formatów, w zależności od wymagań konkretnego przypadku użycia.
Profile w konfiguracji
W Spring Boot profile konfiguracyjne odgrywają kluczową rolę, pozwalając na elastyczne zarządzanie różnymi
ustawieniami dla różnych środowisk, takich jak rozwój oprogramowania (development), testowanie (testing)
i produkcja (production).
Profile te umożliwiają określenie unikalnych właściwości konfiguracyjnych dla każdego środowiska, zapewniając, że
odpowiednia konfiguracja jest załadowana w zależności od aktywnego profilu. Dzięki temu mechanizmowi możemy łatwo
przełączać się między różnymi konfiguracjami, co jest szczególnie przydatne w procesie rozwoju aplikacji i jej
wdrażania.
Jeżeli 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.
Film powstał dla Spring Boot 2, ale jest także aktualny dla Spring Boot 3.
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 IntelliJ — Run > Edit Configurations
i tu dla wybranego projektu szukasz opcji VM options albo jeśli taka opcja jest niewidoczna,
dodajesz ją za pomocą opcji Modify options.
W Eclipse — Run As > Run Configurations... > Arguments > VM arguments...
Argument maszyny wirtualnej 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ę.
Rekomendacja
W kontekście konfiguracji aplikacji Spring, format YAML zyskał dużą popularność, szczególnie w
projektach opartych na architekturze mikrousług. Zauważa się tendencję, że w klasycznych aplikacjach
webowych częściej stosowane są konfiguracje oparte na plikach .properties.
Istnieje również możliwość jednoczesnego wykorzystywania obu typów plików konfiguracyjnych. W takim
przypadku, aspekty konfiguracji lepiej pasujące do formatu YAML, na przykład konfiguracja OAuth2,
mogą być przechowywane w plikach .yml, podczas gdy pozostała część konfiguracji może znajdować się w
plikach .properties.
To podejście jest przez nas cenione za jego elastyczność. Jednakże, wybór
odpowiedniego formatu konfiguracyjnego powinien być dostosowany do konkretnego projektu i
preferencji zespołu, zwłaszcza w środowisku samoorganizującego się zespołu scrumowego.
Praktyka
W ramach naszych kursów, w tym
Kursu Aplikacji Web - Mega pakiet, szczególną uwagę przywiązujemy do starannego
konfigurowania plików
.properties. W niektórych z tych plików wykorzystujemy specjalnie zdefiniowane
zmienne konfiguracyjne, takie jak ścieżki do przechowywania zdjęć w aplikacjach webowych czy ustawienia konta
pocztowego służącego do wysyłania emaili. Takie szczegółowe konfiguracje są integralną częścią naszych aplikacji
i mają na celu zapewnienie ich optymalnego działania oraz dostosowania do specyficznych wymagań kursu.
Autor: Jarek Klimas
Data: 03 stycznia 2024
Labele: Backend, Podstawowy, Java
Czy informacje, które otrzymałeś, były pomocne?
Jeśli tak, zapraszam Cię do podarowania mi kawy.
Topowe Materiały
Spring IO: Profiles
Spring IO: Change configuration depending on the environment
Baeldung: Spring YAML vs Properties
Baeldung: Spring Profiles
Baeldung: A Guide to Spring Boot Configuration Metadata
Udemy: [NEW] Spring Boot 3, Spring 6 & Hibernate for Beginners — polskie napisy