Anotácia jar @ConditionalOnProperty

1. Prehľad

V tomto krátkom tutoriále si osvetlíme hlavné účel @ConditionalOnProperty anotácia.

Najprv začneme trochou pozadia o tom, čo @ConditionalOnProperty je. Potom sa pozrieme na niekoľko praktických príkladov, ktoré nám pomôžu pochopiť, ako to funguje a aké funkcie prináša.

2. Účel @ConditionalOnProperty

Pri vývoji jarných aplikácií sa zvyčajne možno budeme musieť vytvoriť niektoré fazule podmienene na základe prítomnosti a hodnoty vlastnosti konfigurácie.

Napríklad môžeme chcieť zaregistrovať a Dátový zdroj bean, aby ukázal na produkčnú alebo testovaciu databázu v závislosti od toho, či nastavíme hodnotu vlastnosti na „prod“ alebo „test“.

Našťastie to nie je také ťažké, ako by sa na prvý pohľad mohlo zdať. Jarný rámec poskytuje @ConditionalOnProperty anotáciu presne na tento účel.

Stručne povedané, @ConditionalOnProperty umožňuje registráciu fazule iba v prípade, že je k dispozícii vlastnosť prostredia a má konkrétnu hodnotu. Predvolene musí byť zadaná vlastnosť definovaná a nesmie sa rovnať nepravdivé.

Teraz, keď sme už oboznámení s účelom @ConditionalOnProperty anotáciu, poďme sa hlbšie pozrieť, ako to funguje.

3. The @ConditionalOnProperty Anotácia v praxi

Na ilustráciu použitia @ConditionalOnProperty, vypracujeme základný oznamovací systém. Aby sme to zjednodušili, predpokladajme, že chceme posielať e-mailové upozornenia.

Najskôr budeme musieť vytvoriť jednoduchú službu na odosielanie notifikačných správ. Zvážte napríklad NotificationSender rozhranie:

verejné rozhranie NotificationSender {String send (String message); }

Ďalej poskytneme implementáciu NotificationSender rozhranie na zasielanie našich e-mailov:

verejná trieda EmailNotification implementuje NotificationSender {@Override public String send (String message) {return "Email Notification:" + message; }}

Teraz sa pozrime, ako využiť @ConditionalOnProperty anotácia. Poďme nakonfigurovať NotificationSender fazuľa tak, že sa načíta iba v prípade, že nehnuteľnosť notification.service je definovaný:

@Bean (name = "emailNotification") @ConditionalOnProperty (prefix = "notification", name = "service") public NotificationSender notificationSender () {return new EmailNotification (); }

Ako vidíme, predpona a názov atribúty sa používajú na označenie konfiguračnej vlastnosti, ktorá by sa mala skontrolovať.

Na záver musíme pridať posledný chýbajúci kúsok skladačky. Definujme si svoju vlastnú vlastnosť v application.properties spis:

notification.service = e-mail

4. Pokročilá konfigurácia

Ako sme sa už dozvedeli, @ConditionalOnProperty anotácia nám umožňuje podmienene registrovať fazuľa v závislosti od prítomnosti vlastnosti konfigurácie.

S touto anotáciou však môžeme urobiť viac než len to. Poďme teda preskúmať!

Predpokladajme, že chceme pridať ďalšiu notifikačnú službu - napríklad službu, ktorá nám umožní posielať SMS notifikácie.

Aby sme to dosiahli, musíme vytvoriť ďalší NotificationSender implementácia:

verejná trieda SmsNotification implementuje NotificationSender {@Override public String send (String message) {return "SMS Notification:" + message; }}

Pretože máme dve implementácie, pozrime sa, čo môžeme využiť @ConditionalOnProperty naložiť pravú NotificationSender fazuľa podmienečne.

Na tento účel poskytuje anotácia: havingValue atribút. Celkom zaujímavé, todefinuje hodnotu, ktorú musí mať vlastnosť, aby bolo možné do kontajnera Spring pridať konkrétnu fazuľu.

Teraz upresnime, za akých podmienok chceme zaregistrovať SmsNotification implementácia v kontexte:

@Bean (name = "smsNotification") @ConditionalOnProperty (prefix = "notification", name = "service", havingValue = "sms") public NotificationSender notificationSender2 () {vrátiť nový SmsNotification (); }

S pomocou havingValue atribút, dali sme jasne najavo, že chceme načítať SmsNotification iba ak notification.service je nastavený na sms.

Za zmienku to stojí @ConditionalOnProperty má iný atribút s názvom matchIfMissing. Tento atribút určuje, či sa má podmienka zhodovať v prípade, že vlastnosť nie je k dispozícii.

Teraz poďme všetky časti spojiť a napíšme jednoduchý testovací prípad, aby sme potvrdili, že všetko funguje podľa očakávaní:

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

5. Záver

V tomto krátkom tutoriáli sme zdôraznili účel použitia @ConditionalOnProperty anotácia. Potom sme si prostredníctvom praktického príkladu predstavili, ako ho použiť na podmienené naloženie jarných bôbov.

Celý zdrojový kód tohto tutoriálu je ako vždy k dispozícii na stránkach GitHub.


$config[zx-auto] not found$config[zx-overlay] not found