Svojstva s Spring and Spring Boot

1. Pregled

Ovaj tutorial će pokazati kako postaviti i koristiti svojstva u proljeće putem Java konfiguracije i @PropertySource.

Također ćemo vidjeti kako svojstva rade u Spring Boot-u.

2. Registrirajte datoteku svojstava putem napomena

Proljeće 3.1 također predstavlja Novi @PropertySource bilješka kao prikladan mehanizam za dodavanje izvora imovine u okoliš.

Ovu bilješku možemo koristiti zajedno s @Konfiguracija napomena:

@Configuration @PropertySource ("classpath: foo.properties") javna klasa PropertiesWithJavaConfig {// ...}

Još jedan vrlo koristan način registracije nove datoteke svojstava je korištenje rezerviranog mjesta, što nam omogućuje dinamički odaberite pravu datoteku za vrijeme izvođenja:

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

2.1. Definiranje više lokacija imovine

The @PropertySource napomena je ponovljiva u skladu s Java 8 konvencijama. Stoga, ako koristimo Javu 8 ili noviju, ovu napomenu možemo koristiti za definiranje više lokacija svojstava:

@PropertySource ("classpath: foo.properties") @PropertySource ("classpath: bar.properties") javna klasa PropertiesWithJavaConfig {// ...}

Naravno, možemo koristiti i @PropertySources napomena i navedite niz od @PropertySource. To radi u bilo kojoj podržanoj Javinoj verziji, ne samo u Javi 8 ili novijoj:

@PropertySources ({@PropertySource ("classpath: foo.properties"), @PropertySource ("classpath: bar.properties")}) javna klasa PropertiesWithJavaConfig {// ...}

U oba slučaja, vrijedi napomenuti da u slučaju sudara imena svojstva, posljednji pročitani izvor ima prednost.

3. Korištenje / ubrizgavanje svojstava

Ubrizgavanje imovine s @Vrijednost bilješka je izravno:

@Value ("$ {jdbc.url}") privatni niz jdbcUrl;

Također možemo odrediti zadanu vrijednost za svojstvo:

@Value ("$ {jdbc.url: aDefaultUrl}") privatni niz jdbcUrl;

Novi PropertySourcesPlaceholderConfigurer dodano u proljeće 3.1 riješiti $ {…} rezervirana mjesta unutar vrijednosti svojstva definicije graha i @Vrijednost bilješke.

Napokon, možemo dobiti vrijednost nekretnine pomoću Okoliš API:

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

4. Svojstva s opružnim čizmom

Prije nego što krenemo u naprednije mogućnosti konfiguracije svojstava, provedimo neko vrijeme gledajući novu podršku svojstava u Spring Boot-u.

Općenito govoreći, ova nova podrška uključuje manje konfiguracije u usporedbi sa standardnim Springom, što je naravno jedan od glavnih ciljeva Boota.

4.1. svojstva.svojstva: zadana datoteka svojstva

Dizanje primjenjuje tipičnu konvenciju nad konfiguracijskim pristupom na datoteke svojstava. Ovo znači to možemo jednostavno staviti primjena.svojstva datoteku u našem src / glavni / resursi direktorij i automatski će se otkriti. Tada iz njega možemo ubrizgati sva učitana svojstva kao i obično.

Dakle, pomoću ove zadane datoteke ne moramo izričito registrirati PropertySource ili čak pružiti put do datoteke svojstva.

Također možemo konfigurirati drugu datoteku tijekom izvođenja ako je potrebno, koristeći svojstvo okoline:

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

Od Spring Boota 2.3, možemo odrediti i zamjenske lokacije za konfiguracijske datoteke.

Na primjer, možemo postaviti proljeće.konfig.lokacija svojstvo da config / * /:

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

Na taj će način Spring Boot tražiti konfiguracijske datoteke koje odgovaraju config / * / uzorak direktorija izvan naše jar datoteke. To nam dobro dođe kada imamo više izvora svojstava konfiguracije.

Od verzije 2.4.0, Spring Boot podržava upotrebu datoteka sa svojstvima više dokumenata, slično kao što YAML radi dizajnom:

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

Imajte na umu da za datoteke svojstava oznaci s tri crtice prethodi znak komentara (#).

4.2. Datoteka svojstava specifična za okoliš

Ako trebamo ciljati različita okruženja, za to postoji ugrađeni mehanizam za pokretanje.

Jednostavno možemo definirati primjena- okruženje.svojstva datoteku u src / glavni / resursi direktorija, a zatim postavite profil Spring s istim imenom okoline.

Na primjer, ako definiramo "scensko" okruženje, to znači da ćemo morati definirati a inscenacija profil i zatim etapa primjene.svojstva.

Ova env datoteka bit će učitana i imat će prednost nad zadanom datotekom svojstava. Imajte na umu da će se zadana datoteka i dalje učitavati, samo kada dođe do sudara svojstva, datoteka svojstva specifična za okruženje ima prednost.

4.3. Datoteka svojstava specifična za test

Mogli bismo imati i zahtjev za upotrebom različitih vrijednosti svojstava kada je naša aplikacija na testiranju.

Spring Boot to rješava za nas gledajući naš src / test / resources direktorij tijekom probnog rada. Opet, zadana svojstva i dalje će se moći ubrizgati kao i obično, ali će ih nadjačati ako dođe do sudara.

4.4. The @TestPropertySource Bilješka

Ako trebamo detaljniju kontrolu nad svojstvima ispitivanja, tada možemo koristiti @TestPropertySource bilješka.

To nam omogućuje da postavimo svojstva testa za određeni kontekst testa, imajući prednost nad zadanim izvorima svojstava:

@RunWith (SpringRunner.class) @TestPropertySource ("/ foo.properties") javna klasa FilePropertyInjectionUnitTest {@Value ("$ {foo}") private String foo; @Test public void whenFilePropertyProvided_thenProperlyInjected () {assertThat (foo) .isEqualTo ("bar"); }}

Ako ne želimo koristiti datoteku, možemo izravno odrediti imena i vrijednosti:

@RunWith (SpringRunner.class) @TestPropertySource (svojstva = {"foo = bar"}) javna klasa PropertyInjectionUnitTest {@Value ("$ {foo}") private String foo; @Test public void whenPropertyProvided_thenProperlyInjected () {assertThat (foo) .isEqualTo ("bar"); }}

Sličan učinak možemo postići i pomoću Svojstva argument @SpringBootTest napomena:

@RunWith (SpringRunner.class) @SpringBootTest (svojstva = {"foo = bar"}, classes = SpringBootPropertiesTestApplication.class) javna klasa SpringBootPropertyInjectionIntegrationTest {@Value ("$ {foo}") private String foo; @Test public void whenSpringBootPropertyProvided_thenProperlyInjected () {assertThat (foo) .isEqualTo ("bar"); }}

4.5. Hijerarhijska svojstva

Ako imamo svojstva koja su grupirana zajedno, možemo koristiti @ConfigurationProperties napomena koja će preslikati ove hijerarhije svojstava u grafikone Java objekata.

Uzmimo neka svojstva koja se koriste za konfiguriranje veze s bazom podataka:

database.url = jdbc: postgresql: / localhost: 5432 / instance database.username = foo database.password = bar

A onda upotrijebimo bilješku kako bismo ih preslikali na objekt baze podataka:

@ConfigurationProperties (prefix = "database") javna klasa Baza podataka {String url; Korisničko ime niza; Lozinka niza; // standardni geteri i postavljači}

Spring Boot ponovno primjenjuje svoju konvenciju na pristup konfiguracije, automatski preslikavajući imena svojstava i njihova odgovarajuća polja. Sve što trebamo dostaviti je prefiks svojstva.

Ako želite dublje istražiti svojstva konfiguracije, pogledajte naš detaljni članak.

4.6. Alternativa: YAML datoteke

Spring također podržava YAML datoteke.

Sva ista pravila imenovanja primjenjuju se na datoteke specifične za test, specifične za okoliš i zadane osobine. Jedina razlika je ekstenzija datoteke i ovisnost o SnakeYAML knjižnici koja se nalazi na našoj stazi.

YAML je posebno dobar za hijerarhijsku pohranu svojstava; sljedeću datoteku svojstava:

database.url = jdbc: postgresql: / localhost: 5432 / instance database.username = foo database.password = bar tajna: foo

je sinonim za sljedeću YAML datoteku:

baza podataka: url: jdbc: postgresql: / localhost: 5432 / primjer korisničko ime: foo lozinka: bar tajna: foo

Također je vrijedno spomenuti da YAML datoteke ne podržavaju @PropertySource ako trebamo koristiti ovu napomenu, to bi nas ograničilo na upotrebu datoteke svojstava.

Još jedna izvanredna stvar je da je u verziji 2.4.0 Spring Boot promijenio način učitavanja svojstava iz YAML datoteka s više dokumenata. Prije se redoslijed dodavanja temeljio na redoslijedu aktiviranja profila. Međutim, s novom verzijom, okvir slijedi ista pravila narudžbe za koja smo ranije naznačili .Svojstva datoteke; svojstva deklarirana niže u datoteci jednostavno će nadjačati ona viša.

Osim toga, u ovoj verziji profili se više ne mogu aktivirati iz dokumenata specifičnih za profil, što čini ishod jasnijim i predvidljivijim.

4.7. Uvoz dodatnih konfiguracijskih datoteka

Prije verzije 2.4.0, Spring Boot je dopuštao uključivanje dodatnih konfiguracijskih datoteka pomoću proljeće.konfig.lokacija i spring.config.additional-location svojstva, ali imali su određena ograničenja. Na primjer, morali su biti definirani prije pokretanja aplikacije (kao svojstva okoline ili sustava ili korištenjem argumenata naredbenog retka) jer su korišteni rano u procesu.

U spomenutoj verziji, možemo koristiti spring.config.import nekretnina unutar primjena.svojstva ili primjena.iml datoteku za jednostavno uključivanje dodatnih datoteka. Ovo svojstvo podržava neke zanimljive značajke:

  • dodavanje nekoliko datoteka ili direktorija
  • datoteke se mogu učitati ili iz puta predavanja ili iz vanjskog direktorija
  • naznačujući bi li postupak pokretanja trebao propasti ako datoteka nije pronađena ili je to neobavezna datoteka
  • uvoz datoteka bez ekstenzija

Pogledajmo valjan primjer:

spring.config.import = put do klase: dodatna- aplikacija.properties, put do klase: dodatna-aplikacija [.yml], neobavezno: datoteka: ./ external.properties, put do klase: svojstva-dodatna-aplikacija /

Napomena: ovdje smo formatirali ovo svojstvo koristeći prelome redaka samo radi jasnosti.

Proljeće će uvoz tretirati kao novi dokument umetnut odmah ispod uvozne deklaracije.

4.8. Svojstva iz argumenata naredbenog retka

Osim korištenja datoteka, svojstva možemo prenositi i izravno na naredbeni redak:

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

To možemo učiniti i putem svojstava sustava koja su dana prije -jar naredba, a ne nakon nje:

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

4.9. Svojstva iz varijabli okoline

Spring Boot također će otkriti varijable okoline, tretirajući ih kao svojstva:

izvoz ime = vrijednost java -jar app.jar 

4.10. Randomizacija vrijednosti svojstava

Ako ne želimo determinističke vrijednosti svojstva, možemo koristiti RandomValuePropertySource randomizirati vrijednosti svojstava:

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

4.11. Dodatne vrste izvora imovine

Spring Boot podržava mnoštvo izvora svojstva, implementirajući dobro promišljeni poredak kako bi se omogućilo razumno nadjačavanje. Vrijedno je pogledati službenu dokumentaciju koja ide dalje od opsega ovog članka.

5. Konfiguracija pomoću sirovog graha - PropertySourcesPlaceholderConfigurer

Osim prikladnih metoda za dobivanje svojstava u Spring, također možemo ručno definirati i regitrirati grah za konfiguraciju svojstva.

Suradnja s PropertySourcesPlaceholderConfigurer daje nam potpunu kontrolu nad konfiguracijom, s nedostatkom što je opširniji i većinu vremena nepotreban.

Pogledajmo kako možemo definirati ovaj grah pomoću Java konfiguracije:

@Bean public static PropertySourcesPlaceholderConfigurer properties () {PropertySourcesPlaceholderConfigurer pspc = new PropertySourcesPlaceholderConfigurer (); Resource [] resources = new ClassPathResource [] {new ClassPathResource ("foo.properties")}; pspc.setLokacije (resursi); pspc.setIgnoreUnresolvablePlaceholders (true); vratiti pspc; }

6. Svojstva u kontekstima roditelja i djeteta

Ovo se pitanje pojavljuje iznova i iznova: što se događa kad naše web aplikacija ima roditeljski i podređeni kontekst? Nadređeni kontekst može imati neke zajedničke osnovne funkcije i grah, a zatim jedan (ili više) podređenih konteksta, koji možda sadrže grah specifičan za servlet.

U tom slučaju, koji je najbolji način definirati datoteke svojstava i uključiti ih u ove kontekste? A kako najbolje doći do ovih svojstava s proljeća?

Dat ćemo jednostavnu raščlambu.

Ako je datoteka definirano u roditeljskom kontekstu:

  • @Vrijednost radi u Dječji kontekst: DA
  • @Vrijednost radi u Kontekst roditelja: DA
  • okoliš.getProperty u Dječji kontekst: DA
  • okoliš.getProperty u Kontekst roditelja: DA

Ako je datoteka definirana u kontekstu Dijete:

  • @Vrijednost radi u Dječji kontekst: DA
  • @Vrijednost radi u Kontekst roditelja: NE
  • okoliš.getProperty u Dječji kontekst: DA
  • okoliš.getProperty u Kontekst roditelja: NE

7. Zaključak

Ovaj je članak prikazao nekoliko primjera rada sa svojstvima i datotekama svojstava u proljeće.

Kao i uvijek, cijeli kôd koji podupire članak dostupan je na GitHub-u.