Proljetni profili

1. Pregled

U ovom uputstvu usredotočit ćemo se na uvođenje profila u proljeće.

Profili su ključna značajka okvira - omogućujući nam mapiranje graha na različite profile - na primjer, razv, test, i prod.

Tada možemo aktivirati različite profile u različitim okruženjima kako bismo pokrenuli samo grah koji nam treba.

2. Koristite @Profil na grahu

Krenimo jednostavno i pogledajmo kako grah možemo učiniti određenim profilom. Koristimo @Profil napomena - mapiramo grah na taj određeni profil; napomena jednostavno uzima imena jednog (ili više) profila.

Razmotrimo osnovni scenarij: Imamo grah koji bi trebao biti aktivan samo tijekom razvoja, ali ne i biti ugrađen u proizvodnju.

Taj grah bilježimo s razv profila, a u spremniku će biti prisutan samo tijekom razvoja. U proizvodnji, razv jednostavno neće biti aktivan:

@Component @Profile ("dev") javna klasa DevDatasourceConfig

Kao kratki dodatak, nazivima profila može se dodati i prefiks s operatorom NOT, npr. ! razv, da ih izuzme iz profila.

U primjeru se komponenta aktivira samo ako razv profil nije aktivan:

@Component @Profile ("! Dev") javna klasa DevDatasourceConfig

3. Proglasite profile u XML-u

Profili se također mogu konfigurirati u XML-u. The oznaka ima profili atribut, koji uzima vrijednosti odvojene zarezom primjenjivih profila:

4. Postavite profile

Sljedeći je korak aktiviranje i postavljanje profila tako da se odgovarajući grah registrira u spremniku.

To se može učiniti na razne načine, što ćemo istražiti u sljedećim odjeljcima.

4.1. Programski putem WebApplicationInitializer Sučelje

U web aplikacijama, WebApplicationInitializer može se koristiti za konfiguriranje ServletContext programski.

Također je vrlo zgodno mjesto za programsko postavljanje naših aktivnih profila:

@Configuration javna klasa MyWebApplicationInitializer implementira WebApplicationInitializer {@Override public void onStartup (ServletContext servletContext) baca ServletException {servletContext.setInitParameter ("spring.profiles.active", "dev", "dev", "dev"; " }}

4.2. Programski putem Podesivo okruženje

Također možemo postaviti profile izravno na okoliš:

@Autowired private ConfigurableEnvironment env; ... env.setActiveProfiles ("someProfile");

4.3. Parametar konteksta u web.xml

Slično tome, možemo definirati aktivne profile u web.xml datoteka web aplikacije, koristeći parametar konteksta:

 contextConfigLocation /WEB-INF/app-config.xml spring.profiles.active dev 

4.4. Parametar JVM sustava

Imena profila također se mogu prosljeđivati ​​putem parametra JVM sustava. Ovi će se profili aktivirati tijekom pokretanja aplikacije:

-Dspring.profiles.active = dev

4.5. Promjenjiva okolina

U Unix okruženju, profili se također mogu aktivirati putem varijable okoline:

izvoz spring_profiles_active = dev

4.6. Profil Maven

Proljetni profili se također mogu aktivirati putem Maven profila, do navodeći opruga.profili.aktivan svojstvo konfiguracije.

U svakom Mavenovom profilu možemo postaviti opruga.profili.aktivan svojstvo:

  dev true dev prod prod 

Njegova vrijednost koristit će se za zamjenu @ [zaštićen e-poštom] rezervirano mjesto u primjena.svojstva:

[e-pošta zaštićena] @

Sada moramo omogućiti filtriranje resursa u pom.xml:

   src / main / resources true ... 

i dodati a -P parametar za prebacivanje Maven profila koji će se primijeniti:

mvn čist paket -Prod

Ova će naredba spakirati aplikaciju za prod profil. Također se primjenjuje opruga.profili.aktivan vrijednost prod za ovu aplikaciju kada je pokrenuta.

4.7. @ActiveProfile u testovima

Testovima je vrlo lako odrediti koji su profili aktivni pomoću @ActiveProfile napomena za omogućavanje određenih profila:

@ActiveProfiles ("dev")

Do sada smo pogledali više načina aktiviranja profila. Pogledajmo sada koja ima prioritet nad drugom i što će se dogoditi ako koristimo više njih, od najvišeg do najnižeg prioriteta:

  1. Parametar konteksta u web.xml
  2. WebApplicationInitializer
  3. Parametar JVM sustava
  4. Promjenjiva okolina
  5. Maven profil

5. Zadani profil

Bilo koji grah koji ne navodi profil pripada zadano profil.

Spring također nudi način postavljanja zadanog profila kada nijedan drugi profil nije aktivan - pomoću opruga.profili.default imovine.

6. Nabavite aktivne profile

Aktivni profili Springa pokreću ponašanje uređaja @Profil napomena za omogućavanje / onemogućavanje graha. Međutim, možda ćemo htjeti i programski pristupiti popisu aktivnih profila.

Imamo dva načina da to učinimo, koristeći Okoliš ili proljeće.aktivan.profil.

6.1. Koristeći Okoliš

Aktivnim profilima možemo pristupiti s Okoliš objekt ubrizgavanjem:

javna klasa ProfileManager {@Autowired privatno okruženje okoliša; javna void getActiveProfiles () {za (StringName profila: environment.getActiveProfiles ()) {System.out.println ("Trenutno aktivan profil -" + profileName); }}}

6.2. Koristeći proljeće.aktivan.profil

Alternativno, profilima bismo mogli pristupiti ubrizgavanjem imovine opruga.profili.aktivan:

@Value ("$ {spring.profiles.active}") privatni niz activeProfile;

Evo, naša aktivni profil varijabilna sadržavat će ime trenutno aktivnog profila, a ako ih je nekoliko, sadržavat će njihova imena odvojena zarezom.

Međutim, trebali bismo razmislite što bi se dogodilo ako uopće nema aktivnog profila. S našim gornjim kodom, odsutnost aktivnog profila spriječila bi stvaranje konteksta aplikacije. To bi rezultiralo IlegalArgumentException zbog nedostajućeg rezerviranog mjesta za ubrizgavanje u varijablu.

Da bismo to izbjegli, možemo definirati zadanu vrijednost:

@Value ("$ {spring.profiles.active:}") privatni niz activeProfile;

Sada, ako nijedan profil nije aktivan, naš aktivni profil sadržavat će prazan niz.

A ako želimo pristupiti njihovom popisu baš kao u prethodnom primjeru, to možemo učiniti razdvajanjem aktivni profil varijabla:

javna klasa ProfileManager {@Value ("$ {spring.profiles.active:}") private String activeProfiles; javni String getActiveProfiles () {za (StringName profila: activeProfiles.split (",")) {System.out.println ("Trenutno aktivan profil -" + profileName); }}}

7. Primjer: Odvojite konfiguracije izvora podataka pomoću profila

Sad kad se osnove ne maknu, pogledajmo pravi primjer.

Razmotrimo scenarij gdje moramo održavati konfiguraciju izvora podataka i za razvojno i za proizvodno okruženje.

Stvorimo zajedničko sučelje DatasourceConfig koji moraju implementirati obje implementacije izvora podataka:

javno sučelje DatasourceConfig {postavljanje javne praznine (); }

Slijedi konfiguracija razvojnog okruženja:

@Component @Profile ("dev") javna klasa DevDatasourceConfig implementira DatasourceConfig {@Override public void setup () {System.out.println ("Postavljanje izvora podataka za DEV okruženje."); }}

I konfiguracija za proizvodno okruženje:

@Component @Profile ("production") javna klasa ProductionDatasourceConfig implementira DatasourceConfig {@Override public void setup () {System.out.println ("Postavljanje izvora podataka za PRODUKCIJSKO okruženje."); }}

Ajmo sada stvoriti test i ubrizgati naše DatasourceConfig sučelje; ovisno o aktivnom profilu, ubrizgat će Spring DevDatasourceConfig ili ProductionDatasourceConfig grah:

javna klasa SpringProfilesWithMavenPropertiesIntegrationTest {@Autowired DatasourceConfig datasourceConfig; javna praznina setupDatasource () {datasourceConfig.setup (); }}

Kada razv profil je aktivan, Spring injektira DevDatasourceConfig objekt, a pri pozivu tada postaviti() metoda, slijedi izlaz:

Postavljanje izvora podataka za DEV okruženje.

8. Profili u Spring Boot-u

Spring Boot podržava sve dosad navedene konfiguracije profila, s nekoliko dodatnih značajki.

Parametar inicijalizacije opruga.profili.aktivan, predstavljen u odjeljku 4, također se može postaviti kao svojstvo u Spring Boot-u za definiranje trenutno aktivnih profila. Ovo je standardno svojstvo koje će Spring Boot automatski preuzeti:

opruga.profili.aktivan = dev

Za programsko postavljanje profila možemo koristiti i SpringApplication razred:

SpringApplication.setAdditionalProfiles ("dev");

Da bismo postavili profile pomoću Mavena u Spring Boot-u, možemo odrediti imena profila pod dodatak za proljetni boot-maven u pom.xml:

  org.springframework.boot spring-boot-maven-plugin dev ... 

i izvršite cilj Mavena specifičan za Spring Boot:

mvn spring-boot: trčanje

Ali najvažnija značajka povezana s profilima koju donosi Spring Boot je datoteke svojstava specifičnih za profil. Oni moraju biti imenovani u formatu aplikacija- {profil} .svojstva.

Spring Boot automatski će učitati svojstva u primjena.svojstva datoteku za sve profile i one u određenim profilima .Svojstva datoteke samo za navedeni profil.

Na primjer, možemo konfigurirati različite izvore podataka za razv i proizvodnja profila pomoću dvije imenovane datoteke svojstva- aplikacija.vlasnosti i primjena- proizvodnja.svojstva:

U primjena- proizvodnja.svojstva datoteku, možemo postaviti MySql izvor podataka:

spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver spring.datasource.url = jdbc: mysql: // localhost: 3306 / db spring.datasource.username = root spring.datasource.password = root

Tada možemo konfigurirati ista svojstva za razv profil u svojstva- aplikacija.vlasnosti datoteku za upotrebu u memoriji H2 baza podataka:

spring.datasource.driver-class-name = org.h2.Driver spring.datasource.url = jdbc: h2: mem: db; DB_CLOSE_DELAY = -1 spring.datasource.username = sa spring.datasource.password = sa

Na taj način možemo lako pružiti različite konfiguracije za različita okruženja.

9. Zaključak

U ovom smo članku razgovarali o tome kako definirati profil na grahu i kako onda omogućiti prave profile u našoj prijavi.

Konačno, svoje smo razumijevanje profila potvrdili jednostavnim, ali stvarnim primjerom.

Provedbu ovog vodiča možete pronaći u projektu GitHub.