A tavaszi @ConditionalOnProperty kommentár

1. Áttekintés

Ebben a rövid bemutatóban rávilágítunk a főre célja a @ConditionalOnProperty annotáció.

Először is kezdünk egy kis háttérrel arról, hogy mit @ConditionalOnProperty van. Ezután megnézünk néhány gyakorlati példát, amelyek segítenek megérteni, hogyan működik és milyen funkciókat tartalmaz.

2. A cél @ConditionalOnProperty

Általában a tavaszi alkalmazások fejlesztésekor szükségünk lehet néhány bab létrehozására feltételesen a konfigurációs tulajdonság jelenléte és értéke alapján.

Például érdemes regisztrálni a Adatforrás Bean, hogy mutasson egy produkcióra vagy egy teszt adatbázisra, attól függően, hogy a tulajdonság értékét „prod” vagy „test” értékre állítjuk-e.

Szerencsére ennek elérése nem olyan nehéz, mint első pillantásra tűnhet. A tavaszi keret biztosítja a @ConditionalOnProperty annotáció pontosan erre a célra.

Röviden, a @ConditionalOnProperty A bab regisztrálását csak akkor engedélyezi, ha egy környezeti tulajdonság jelen van és meghatározott értékkel rendelkezik. Alapértelmezés szerint a megadott tulajdonságot meg kell határozni, és nem egyenlő ezzel hamis.

Most, hogy megismertük a @ConditionalOnProperty annotáció, ássunk mélyebben, hogy lássuk, hogyan működik.

3. Az @ConditionalOnProperty Megjegyzés a gyakorlatban

Például a @ConditionalOnProperty, kifejlesztünk egy alap értesítési rendszert. Tegyük fel, hogy a dolgok egyszerűsítése érdekében e-mailes értesítéseket akarunk küldeni.

Először is létre kell hoznunk egy egyszerű szolgáltatást értesítési üzenet küldéséhez. Például vegye figyelembe a NotificationSender felület:

nyilvános felület NotificationSender {String send (String üzenet); }

Ezután adjuk meg a NotificationSender felület az e-mailjeink elküldéséhez:

public class EmailNotification megvalósítja az NotificationSender {@Orride public String send (String message) {return "Email Notification:" + üzenet; }}

Most nézzük meg, hogyan lehet használni a @ConditionalOnProperty annotáció. Konfiguráljuk a NotificationSender babot oly módon, hogy csak akkor töltődik be, ha az ingatlan értesítés.szolgáltatás meg van határozva:

@Bean (név = "emailNotification") @ConditionalOnProperty (előtag = "értesítés", név = "szolgáltatás") public NotificationSender notificationSender () {return new EmailNotification (); }

Mint láthatjuk, a előtag és név attribútumokkal jelöljük az ellenőrizni kívánt konfigurációs tulajdonságot.

Végül hozzá kell adnunk a puzzle utolsó hiányzó darabját. Definiáljuk egyéni tulajdonságunkat a alkalmazás.tulajdonságok fájl:

értesítés.szolgáltatás = e-mail

4. Speciális konfiguráció

Mint már megtudtuk, a @ConditionalOnProperty az annotáció lehetővé teszi számunkra, hogy a babot feltételesen regisztráljuk, a konfigurációs tulajdonság meglététől függően.

Ezzel a megjegyzéssel azonban nem csak ezt tehetjük. Tehát, fedezzük fel!

Tegyük fel, hogy egy másik értesítési szolgáltatást szeretnénk felvenni - például egy olyan szolgáltatást, amely lehetővé teszi számunkra, hogy SMS-értesítéseket küldjünk.

Ehhez létre kell hoznunk egy másikat NotificationSender végrehajtás:

public class SmsNotification megvalósítja a NotificationSender {@Orride public String send (String message) {return "SMS Notification:" + üzenet; }}

Mivel két megvalósításunk van, nézzük meg, hogyan tudjuk használni @ConditionalOnProperty hogy betöltse a jobboldalt NotificationSender bab feltételesen.

Ebből a célból az annotáció biztosítja a havingValue tulajdonság. Nagyon érdekes, aztmeghatározza azt az értéket, amelynek egy tulajdonságnak rendelkeznie kell ahhoz, hogy egy adott bab hozzáadódjon a Spring tárolóhoz.

Most adjuk meg, hogy milyen feltétel mellett kívánjuk regisztrálni SmsNotification végrehajtás a kontextusban:

@Bean (név = "smsNotification") @ConditionalOnProperty (előtag = "értesítés", név = "szolgáltatás", havingValue = "sms") nyilvános NotificationSender notificationSender2 () {return new SmsNotification (); }

A segítségével havingValue attribútum, világossá tettük, hogy be akarunk tölteni SmsNotification csak akkor, ha értesítés.szolgáltatás értékre van állítva sms.

Érdemes ezt megemlíteni @ConditionalOnProperty van egy másik attribútuma matchIfMissing. Ez az attribútum határozza meg, hogy a feltételnek egyeznie kell-e abban az esetben, ha a tulajdonság nem érhető el.

Most rakjuk össze az összes darabot, és írjunk egy egyszerű tesztesetet, hogy megerősítsük, hogy minden a várt módon működik:

@Test public void whenValueSetToEmail_thenCreateEmailNotification () {this.contextRunner.withPropertyValues ​​("notification.service = email") .withUserConfiguration (NotificationConfig.class) .run (context -> {assertThat (context) .hasBean ("email"; = context.getBean (EmailNotification.class); assertThat (notificationSender.send ("Hello From Baeldung!")). isEqualTo ("Email Notification: Hello From Baeldung!"); assertThat (context) .doesNotHaveBean ("smsNotification"); }); }

5. Következtetés

Ebben a rövid bemutatóban kiemeltük a @ConditionalOnProperty annotáció. Ezután egy gyakorlati példán keresztül bemutattuk, hogyan lehet felhasználni a tavaszi bab feltételes betöltésére.

Mint mindig, az oktatóanyag teljes forráskódja elérhető a GitHubon.