Bilješka proljeća @ConditionalOnProperty
1. Pregled
U ovom kratkom vodiču osvijetlit ćemo glavno svrha @ConditionalOnProperty bilješka.
Prvo ćemo započeti s malo pozadine o čemu @ConditionalOnProperty je. Zatim ćemo pogledati nekoliko praktičnih primjera kako bismo razumjeli kako to funkcionira i koje značajke donosi.
2. Svrha @ConditionalOnProperty
Tipično, kada razvijate proljetne programe, možda ćemo trebati stvoriti neki grah uvjetno na temelju prisutnosti i vrijednosti svojstva konfiguracije.
Na primjer, možda ćemo htjeti registrirati Izvor podataka bean da upućuje na produkcijsku ili testnu bazu podataka, ovisno o tome postavimo li vrijednost svojstva na "prod" ili "test".
Srećom, postići to nije tako teško kao što bi moglo izgledati na prvi pogled. Proljetni okvir pruža @ConditionalOnProperty napomena upravo u tu svrhu.
Ukratko, @ConditionalOnProperty omogućuje registraciju graha samo ako je svojstvo okoline prisutno i ima određenu vrijednost. Prema zadanim postavkama navedeno svojstvo mora biti definirano i ne mora biti jednako lažno.
Sad kad smo upoznati sa svrhom @ConditionalOnProperty napomena, kopajmo dublje da vidimo kako to funkcionira.
3. The @ConditionalOnProperty Bilješka u praksi
Kao primjer upotrebe @ConditionalOnProperty, razvit ćemo osnovni sustav obavijesti. Da stvar za sada bude jednostavna, pretpostavimo da želimo slati obavijesti e-poštom.
Prvo ćemo morati stvoriti jednostavnu uslugu za slanje obavijesti. Na primjer, razmotrite NotificationSender sučelje:
javno sučelje NotificationSender {String send (String message); }
Dalje, pružimo primjenu NotificationSender sučelje za slanje naše e-pošte:
javna klasa EmailNotification implementira NotificationSender {@Override public String send (String message) {return "Email Notification:" + poruka; }}
Sada, da vidimo kako iskoristiti @ConditionalOnProperty bilješka. Konfigurirajmo NotificationSender grah na takav način da će se učitati samo ako je svojstvo obavijest.usluga je definirano:
@Bean (name = "emailNotification") @ConditionalOnProperty (prefix = "notification", name = "service") public NotificationSender notificationSender () {return new EmailNotification (); }
Kao što vidimo, prefiks i Ime atributi se koriste za označavanje konfiguracijskog svojstva koje treba provjeriti.
Na kraju, moramo dodati posljednji dio slagalice koji nedostaje. Definirajmo svoje prilagođeno svojstvo u primjena.svojstva datoteka:
notification.service = e-pošta
4. Napredna konfiguracija
Kao što smo već naučili, @ConditionalOnProperty anotacija nam omogućuje da grah registriramo uvjetno, ovisno o prisutnosti konfiguracijskog svojstva.
Međutim, s ovom bilješkom možemo učiniti i više od toga. Pa, istražimo!
Pretpostavimo da želimo dodati još jednu uslugu obavijesti - na primjer, uslugu koja će nam omogućiti slanje SMS obavijesti.
Da bismo to učinili, moramo stvoriti drugu NotificationSender provedba:
javna klasa SmsNotification implementira NotificationSender {@Override public String send (String message) {return "SMS Notification:" + poruka; }}
Budući da imamo dvije implementacije, pogledajmo kako se možemo koristiti @ConditionalOnProperty učitati desno NotificationSender grah uvjetno.
U tu svrhu, napomena daje imaVrijednost atribut. Vrlo zanimljivo, todefinira vrijednost koju svojstvo mora imati da bi se određeni grah mogao dodati u spremnik Spring.
Sada, navedimo pod kojim uvjetom želimo registrirati SmsNotification provedba u kontekstu:
@Bean (name = "smsNotification") @ConditionalOnProperty (prefix = "notification", name = "service", havingValue = "sms") javni NotificationSender notificationSender2 () {return new SmsNotification (); }
Uz pomoć imaVrijednost atribut, jasno smo stavili do znanja da se želimo učitati SmsNotification samo kad obavijest.usluga postavljeno je na sms.
Vrijedno je to spomenuti @ConditionalOnProperty ima još jedan atribut koji se naziva matchIfMissing. Ovaj atribut određuje treba li se uvjet podudarati u slučaju da svojstvo nije dostupno.
Sad, spojimo sve dijelove i napišite jednostavan test kako bismo potvrdili da sve funkcionira kako se očekivalo:
@Test public void whenValueSetToEmail_thenCreateEmailNotification () {this.contextRunner.withPropertyValues ("notification.service = email") .withUserConfiguration (NotificationConfig.class) .run (context -> {assertThat (context) .hasBetification (email). = context.getBean (EmailNotification.class); assertThat (notificationSender.send ("Hello from Baeldung!")). isEqualTo ("Email Notification: Hello From Baeldung!"); assertThat (context) .doesNotHaveBean ("smsNotification"); }); }
5. Zaključak
U ovom kratkom vodiču istakli smo svrhu korištenja @ConditionalOnProperty bilješka. Zatim smo kroz praktični primjer prikazali kako se njime uvjetno učitava proljetni grah.
Kao i uvijek, puni izvorni kod ovog vodiča dostupan je na GitHub-u.