Properties with Spring and Spring Boot

Properties with Spring and Spring Boot

przegląd

Ten samouczek pokaże jak skonfigurować i używać właściwości w Spring poprzez konfigurację Javy i @PropertySource.

zobaczymy też, jak działają właściwości w wiosennych butach.

dalsze czytanie:

Spring Expression Language Guide

ten artykuł opisuje Spring Expression Language (SpEL), potężny język wyrażeń, który obsługuje zapytania i manipulowanie wykresami obiektów w czasie wykonywania.,
Czytaj więcej →

Konfiguracja aplikacji webowej Spring Boot

niektóre z bardziej przydatnych konfiguracji aplikacji Spring Boot.
Czytaj więcej →

Przewodnik po adnotacji @ConfigurationProperties w Spring Boot

szybki i praktyczny przewodnik po @ConfigurationProperties adnotacji w Spring Boot.
Czytaj więcej →

Zarejestruj Plik Właściwości za pomocą adnotacji

Wiosna 3.1 wprowadza również nową adnotację @PropertySource jako wygodny mechanizm dodawania źródeł właściwości do środowiska.,

możemy użyć tej adnotacji w połączeniu z adnotacją @Configuration:

@Configuration@PropertySource("classpath:foo.properties")public class PropertiesWithJavaConfig { //...}

innym bardzo użytecznym sposobem rejestracji nowego pliku właściwości jest użycie symbolu zastępczego, który pozwala nam dynamicznie wybrać odpowiedni plik w czasie działania:

@PropertySource({ "classpath:persistence-${envTarget:mysql}.properties"})...

2.1. Definiowanie wielu lokalizacji właściwości

adnotacja @PropertySource jest powtarzalna zgodnie z konwencjami Java 8., Dlatego, jeśli używamy Javy 8 lub wyższej, możemy użyć tej adnotacji do zdefiniowania wielu lokalizacji właściwości:

oczywiście możemy również użyć adnotacji @Propertysource i określić tablicę @PropertySource. Działa to w każdej obsługiwanej wersji Javy, a nie tylko w Javie 8 lub wyższej:

w obu przypadkach warto zauważyć, że w przypadku kolizji nazwy właściwości, pierwszeństwo ma odczyt ostatniego źródła.,

używanie/wstrzykiwanie właściwości

wstrzykiwanie właściwości z adnotacją @Value jest proste:

@Value( "${jdbc.url}" )private String jdbcUrl;

możemy również określić domyślną wartość dla właściwości:

@Value( "${jdbc.url:aDefaultUrl}" )private String jdbcUrl;

Nowy propertysourcesplaceholderconfigurer dodany wiosną 3.1 rozwiązuje symbole zastępcze ${…} w wartościach właściwości Bean definition i adnotacjach @Value.,

wreszcie, możemy uzyskać wartość właściwości za pomocą środowiska API:

@Autowiredprivate Environment env;...dataSource.setUrl(env.getProperty("jdbc.url"));

właściwości Z Spring Boot

zanim przejdziemy do bardziej zaawansowanych opcji konfiguracji właściwości, poświęćmy trochę czasu na zapoznanie się z obsługą nowych właściwości w Spring Boot.

Ogólnie rzecz biorąc, ta nowa obsługa wymaga mniejszej konfiguracji w porównaniu do Standardowej sprężyny, co jest oczywiście jednym z głównych celów rozruchu.

4.1. podanie.,właściwości: domyślny Plik Właściwości

Boot stosuje swoją typową konwencję nad podejściem konfiguracji do plików właściwości. Oznacza to, że możemy po prostu złożyć wniosek.Plik Właściwości w naszym katalogu src / main / resources i zostanie automatycznie wykryty. Możemy wtedy wprowadzić dowolne załadowane właściwości z niego jak zwykle.

tak więc, używając tego domyślnego pliku, nie musimy jawnie rejestrować Źródła właściwości ani nawet podawać ścieżki do pliku właściwości.,

możemy również skonfigurować inny plik w czasie wykonywania, jeśli zajdzie taka potrzeba, używając właściwości environment:

java -jar app.jar --spring.config.location=classpath:/another-location.properties

od wersji Spring Boot 2.3 możemy również określić lokalizacje wieloznaczne dla plików konfiguracyjnych.

na przykład możemy ustawić sprężynę.config.właściwość location to config/*/:

java -jar app.jar --spring.config.location=config/*/

w ten sposób Spring Boot będzie szukał plików konfiguracyjnych pasujących do wzorca katalogu config/* / poza naszym plikiem jar. Przydaje się to, gdy mamy wiele źródeł właściwości konfiguracyjnych.

od wersji 2.4.,0, Spring Boot obsługuje używanie plików właściwości wielu dokumentów, podobnie jak YAML według projektu:

baeldung.customProperty=defaultValue#---baeldung.customProperty=overriddenValue

zauważ, że dla plików właściwości notacja z trzema myślnikami jest poprzedzona znakiem komentarza (#).

4.2. Plik właściwości specyficznych dla środowiska

Jeśli musimy kierować się na różne środowiska, jest do tego wbudowany mechanizm podczas rozruchu.

możemy po prostu zdefiniować środowisko aplikacji.Plik Właściwości w katalogu src / main / resources, a następnie Ustaw profil Spring o tej samej nazwie środowiska.,

na przykład, jeśli zdefiniujemy środowisko „stagingowe”, oznacza to, że będziemy musieli zdefiniować profil stagingowy, a następnie aplikację-staging.właściwości.

ten plik env zostanie załadowany i będzie miał pierwszeństwo przed domyślnym plikiem właściwości. Zauważ, że domyślny plik nadal będzie ładowany, po prostu gdy dojdzie do kolizji właściwości, pierwszeństwo ma plik właściwości specyficznych dla środowiska.

4.3. Plik właściwości specyficznych dla testu

możemy również mieć wymóg używania różnych wartości właściwości, gdy nasza aplikacja jest w trakcie testów.,

Spring Boot radzi sobie z tym za pomocą wyszukiwania w naszym katalogu src/test / resources podczas wykonywania testów. Ponownie, domyślne właściwości nadal będą wstrzykiwane jak zwykle, ale będą przez nie zastępowane w przypadku kolizji.

4.4. Adnotacja @ TestPropertySource

Jeśli potrzebujemy bardziej szczegółowej kontroli nad właściwościami testu, możemy użyć adnotacji @TestPropertySource.,

To pozwala nam ustawić właściwości testowe dla konkretnego kontekstu testowego, mając pierwszeństwo przed domyślną właściwością sources:

Jeśli nie chcemy używać pliku, możemy podać nazwy i wartości bezpośrednio:

możemy również osiągnąć podobny efekt używając argumentu właściwości adnotacji @SpringBootTest:

4.5. Właściwości hierarchiczne

Jeśli mamy właściwości, które są pogrupowane, możemy skorzystać z adnotacji @ConfigurationProperties, która mapuje te hierarchie właściwości na wykresy obiektów Java.,

weźmy kilka właściwości użytych do skonfigurowania połączenia z bazą danych:

database.url=jdbc:postgresql:/localhost:5432/instancedatabase.username=foodatabase.password=bar

a następnie wykorzystajmy adnotację do mapowania ich do obiektu bazy danych:

Spring Boot ponownie stosuje swoją konwencję nad podejściem konfiguracji, automatycznie mapując między nazwami właściwości i odpowiadającymi im polami. Wszystko, co musimy dostarczyć, to prefiks właściwości.

Jeśli chcesz zagłębić się w właściwości konfiguracji, zapoznaj się z naszym dogłębnym artykułem.

4.6. Alternatywa: pliki YAML

Spring obsługuje również pliki YAML.,

wszystkie te same zasady nazewnictwa mają zastosowanie do plików właściwości testowych, środowiskowych i domyślnych. Jedyną różnicą jest rozszerzenie pliku i zależność od Biblioteki SnakeYAML znajdującej się na naszej classpath.,

YAML jest szczególnie dobry do hierarchicznego przechowywania właściwości; następujący plik właściwości:

database.url=jdbc:postgresql:/localhost:5432/instancedatabase.username=foodatabase.password=barsecret: foo

jest równoznaczny z następującym plikiem YAML:

database: url: jdbc:postgresql:/localhost:5432/instance username: foo password: barsecret: foo

warto również wspomnieć, że pliki YAML nie obsługują adnotacji @PropertySource, więc jeśli potrzebujemy użyć tej adnotacji, będzie to ogranicz nas do używania pliku właściwości.

kolejną niezwykłą kwestią jest to, że w wersji 2.4.0 Spring Boot zmienił sposób wczytywania właściwości z plików YAML z wielu dokumentów., Wcześniej kolejność, w jakiej zostały dodane, była oparta na kolejności aktywacji profilu. Jednak w nowej wersji Framework postępuje zgodnie z tymi samymi regułami porządkowania, które wskazaliśmy wcześniej .pliki właściwości; właściwości zadeklarowane niżej w pliku po prostu nadpiszą te wyżej.

ponadto w tej wersji profile nie mogą być już aktywowane z dokumentów profilowych, dzięki czemu wynik jest jaśniejszy i bardziej przewidywalny.

4.7. Importowanie dodatkowych plików konfiguracyjnych

przed wersją 2.4.,0, Spring Boot dozwolone w tym dodatkowe pliki konfiguracyjne za pomocą sprężyny.config.miejsce i źródło.config.dodatkowe-właściwości lokalizacyjne, ale miały pewne ograniczenia. Na przykład, musiały być zdefiniowane przed uruchomieniem aplikacji (jako właściwości środowiska lub systemu, lub za pomocą argumentów wiersza poleceń), ponieważ były używane na początku procesu.

we wspomnianej wersji możemy użyć sprężyny.config.import właściwości wewnątrz aplikacji.Właściwości lub zastosowanie.plik yml do łatwego dołączania dodatkowych plików., Ta właściwość obsługuje kilka interesujących funkcji:

  • dodawanie kilku plików lub katalogów
  • pliki mogą być ładowane ze ścieżki klasowej lub z zewnętrznego katalogu
  • wskazując, czy proces uruchamiania powinien się nie udać, jeśli plik nie zostanie znaleziony, lub jeśli jest to opcjonalny plik
  • Importowanie plików bez rozszerzeń

zobaczmy poprawny przykład:

Uwaga: tutaj sformatowaliśmy tę właściwość używając podziałów linii dla jasności.

Spring będzie traktował import jako nowy dokument wstawiony bezpośrednio pod deklaracją importową.

4.8., Właściwości z argumentów wiersza poleceń

oprócz używania plików, możemy przekazać właściwości bezpośrednio w wierszu poleceń:

java -jar app.jar --property="value"

możemy to zrobić również poprzez właściwości systemowe, które są dostarczane przed poleceniem-jar, a nie po nim:

java -Dproperty.name="value" -jar app.jar

4.9. Właściwości zmiennych środowiskowych

Spring Boot wykryje również zmienne środowiskowe, traktując je jako właściwości:

export name=valuejava -jar app.jar

4.10., Randomizacja wartości właściwości

Jeśli nie chcemy deterministycznych wartości właściwości, możemy użyć randomizacji wartości właściwości:

random.number=${random.int}random.long=${random.long}random.uuid=${random.uuid}

4.11. Dodatkowe typy źródeł właściwości

Spring Boot obsługuje wiele źródeł właściwości, implementując dobrze przemyślaną kolejność, aby umożliwić rozsądne nadpisywanie. Warto zapoznać się z oficjalną dokumentacją, która wykracza poza zakres tego artykułu.,

konfiguracja za pomocą Raw Beans — Właściwośćsourcesplaceholderconfigurer

oprócz wygodnych metod pobierania właściwości do Springa, możemy również ręcznie zdefiniować i zarejestrować konfigurację właściwości bean.

praca z PropertySourcesPlaceholderConfigurer daje nam pełną kontrolę nad konfiguracją, z minusem bycia bardziej gadatliwym i przez większość czasu niepotrzebnym.,

zobaczmy, jak możemy zdefiniować tę fasolę za pomocą konfiguracji Java:

właściwości w kontekstach rodzic-dziecko

to pytanie pojawia się wielokrotnie: co się dzieje, gdy nasza aplikacja internetowa ma kontekst rodzica i dziecka? Kontekst rodzica może mieć kilka wspólnych podstawowych funkcji i beans, a następnie jeden (lub wiele) kontekstów potomnych, może zawierających specyficzne dla servletu beans.

w takim przypadku, jaki jest najlepszy sposób definiowania plików właściwości i umieszczania ich w tych kontekstach? A jak najlepiej odzyskać te właściwości z wiosny?

podamy prosty podział.,

Jeśli plik jest zdefiniowany w kontekście nadrzędnym:

  • @wartość działa w kontekście podrzędnym: tak
  • @wartość działa w kontekście nadrzędnym: tak
  • środowisko.getProperty in Child context: Yes
  • environment.getProperty w kontekście nadrzędnym: Yes

Jeśli plik jest zdefiniowany w kontekście podrzędnym:

  • @Value działa w kontekście podrzędnym: YES
  • @Value działa w kontekście nadrzędnym: no
  • środowisko.getProperty in Child context: Yes
  • environment.,getProperty in Parent context: NO

Conclusion

Ten artykuł pokazał kilka przykładów pracy z plikami właściwości i właściwości w Spring.

jak zawsze, cały kod wspierający artykuł jest dostępny na Githubie.

zacznij korzystać z Spring 5 i Spring Boot 2, korzystając z kursu Learn Spring:

>> kurs

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *