Spring Boot - Konfiguracja

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ść:
server.port=8080
server.session.timeout=600

spring.profiles.active=DEV
spring.http.multipart.max-file-size=3MB
Plik application.yml przechowuje dane w postaci hierarchicznej:
server:
    port: 8080
    session:
        timeout: 600

spring:
    profiles:
        active: DEV
    http:
        multipart:
            max-file-size: 3MB
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):
    @Configuration
    public class Application implements SpringBootServletInitializer {
     
        @Override
        public void onStartup(ServletContext servletContext) throws ServletException {
      
            servletContext.setInitParameter("spring.profiles.active", "DEV");
        }
    }
    
  • Interfejs ConfigurableEnvironment - rzadko używany ze względu na mnogość innych bardziej popularnych opcji:
    @Autowired
    private ConfigurableEnvironment env;
    
    ...
    env.setActiveProfiles("DEV");
    
  • 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...
    -Dspring.profiles.active=dev
    
    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:
    export spring_profiles_active=DEV
    
  • 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@:
    <profiles>
        <profile>
            <id>DEV</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <spring.profiles.active>DEV</spring.profiles.active>
            </properties>
        </profile>
        <profile>
            <id>PROD</id>
            <properties>
                <spring.profiles.active>PROD</spring.profiles.active>
            </properties>
        </profile>
    </profiles>
    
    Należy również pamiętać o włączeniu filtrowania zasobów (aby mogła się udać podmiana placeholdera):
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
        ...
    </build>
    
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:
-Dspring.profiles.active=LOCAL,DEV

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:
@Service
@Profile({ "DEV" })
public class UserServiceImpl implements UserService {

    ...

}   
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:
@Service
@Profile({ "DEV", "LOCAL" })
public class UserServiceImpl implements UserService {

    ...

}   

Podstawowe własności konfiguracyjne

Wracając do Spring Boota, spójrzmy teraz na subiektywną listę popularnych własności konfiguracyjnych wraz z opisami:

server.port - port HTTP, na którym ma być uruchomiony projekt Spring Boot
server.session.timeout - czas trwania sesji
server.ssl.enabled - flaga wskazująca czy połączenie powinno być szyfrowane
server.ssl.key-alias - alias dla klucza w ramach szyfrowania
server.ssl.key-store.timeout - miejsce przechowywania klucza
server.ssl.key-password - hasło do klucza
   
spring.profiles.active - nazwa aktywnego profilu Springa
spring.http.multipart.max-file-size - max. rozmiar pliku przesyłanego na serwer
   
spring.jpa.hibernate.ddl-auto - skrót do hibernate.hbm2ddl.auto, tryb automatycznej aktualizacji schematu bazy danych
spring.jpa.show-sql - flaga wskazująca czy SQL-e powinny być logowane
   
spring.h2.console.enabled - flaga wskazująca czy konsola bazy h2 ma być dostępna
spring.h2.console.path - ścieżka, pod którą konsola bazy h2 jest dostępna na serwerze
spring.h2.console.settings.web-allow-others - flaga wskazująca czy do konsoli bazy h2 można podłączyć się zdalnie
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.
Zdjęcie autora
Autor: Jarek Klimas
Data: 03 stycznia 2024
Labele: Backend, Podstawowy, Java
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

Stale się rozwijamy, a więc bądź na bieżąco!
Na ten adres będziemy przesyłać informacje o ważniejszych aktualizacjach, a także o nowych materiałach pojawiających się na stronie.
Polub nas na Facebooku:
Nasi partnerzy: stackshare
Javappa to również profesjonalne usługi programistyczne oparte o technologie JAVA. Jeśli chesz nawiązać z nami kontakt w celu uzyskania doradztwa bądź stworzenia aplikacji webowej powinieneś poznać nasze doświadczenia.
Kliknij O nas .


Pozycjonowanie stron: Grupa TENSE