Foråret @ConditionalOnProperty Annotation

1. Oversigt

I denne korte vejledning skal vi kaste lys over det vigtigste formålet med @ConditionalOnProperty kommentar.

Først starter vi med lidt baggrund om hvad @ConditionalOnProperty er. Derefter ser vi på nogle praktiske eksempler for at forstå, hvordan det fungerer, og hvilke funktioner det bringer.

2. Formålet med @ConditionalOnProperty

Når der udvikles forårsbaserede applikationer, Vi skal muligvis oprette nogle bønner betinget baseret på tilstedeværelsen og værdien af ​​en konfigurationsegenskab.

For eksempel vil vi måske registrere en Datakilde bønne for at pege på en produktion eller en testdatabase afhængigt af om vi indstiller en egenskabsværdi til "prod" eller "test".

Heldigvis er det ikke så svært, at opnå det ved første øjekast. Foråret rammer giver @ConditionalOnProperty kommentar netop til dette formål.

Kort sagt @ConditionalOnProperty muliggør kun bønneregistrering, hvis en miljøejendom er til stede og har en bestemt værdi. Som standard skal den specificerede egenskab være defineret og ikke være lig med falsk.

Nu hvor vi er bekendt med formålet med @ConditionalOnProperty kommentar, lad os grave dybere for at se, hvordan det fungerer.

3. Den @ConditionalOnProperty Kommentar i praksis

For at eksemplificere brugen af @ConditionalOnProperty, Vi udvikler et grundlæggende notifikationssystem. For at holde tingene enkle for nu, lad os antage, at vi vil sende e-mail-underretninger.

Først skal vi oprette en simpel tjeneste for at sende en besked. Overvej f.eks Meddelelse Afsender grænseflade:

offentlig grænseflade NotificationSender {String send (String message); }

Lad os derefter give en implementering af Meddelelse Afsender interface til at sende vores e-mails:

offentlig klasse EmailNotification implementerer NotificationSender {@Override public String send (String message) {return "Email Notification:" + message; }}

Lad os nu se, hvordan vi gør brug af @ConditionalOnProperty kommentar. Lad os konfigurere Meddelelse Afsender bønne på en sådan måde, at den kun indlæses, hvis ejendommen underretning.service er defineret:

@Bean (name = "emailNotification") @ConditionalOnProperty (prefix = "notifikation", navn = "service") offentlig NotificationSender notificationSender () {returner ny EmailNotification (); }

Som vi kan se, er præfiks og navn attributter bruges til at betegne den konfigurationsegenskab, der skal kontrolleres.

Endelig er vi nødt til at tilføje det sidste manglende stykke af puslespillet. Lad os definere vores brugerdefinerede ejendom i application.properties fil:

notifikation.service = e-mail

4. Avanceret konfiguration

Som vi allerede har lært, er @ConditionalOnProperty annotering giver os mulighed for at registrere bønner betinget afhængigt af tilstedeværelsen af ​​en konfigurationsegenskab.

Vi kan dog gøre mere end bare det med denne kommentar. Så lad os udforske!

Lad os antage, at vi vil tilføje en anden meddelelsestjeneste - for eksempel en tjeneste, der giver os mulighed for at sende SMS-underretninger.

For at gøre det er vi nødt til at oprette en anden Meddelelse Afsender implementering:

offentlig klasse SmsNotification implementerer NotificationSender {@Override public String send (String message) {return "SMS Notification:" + message; }}

Da vi har to implementeringer, lad os se, hvordan vi kan bruge @ConditionalOnProperty at indlæse højre Meddelelse Afsender bønne betinget.

Til dette formål indeholder kommentaren have værdi attribut. Ganske interessant, detdefinerer den værdi, som en ejendom skal have for at en bestemt bønne skal føjes til Spring-containeren.

Lad os nu specificere under hvilken betingelse vi vil registrere Sms-meddelelse implementering i sammenhæng:

@Bean (name = "smsNotification") @ConditionalOnProperty (prefix = "notification", name = "service", havingValue = "sms") public NotificationSender notificationSender2 () {returner ny SmsNotification (); }

Ved hjælp af have værdi attribut, gjorde vi det klart, at vi vil indlæse Sms-meddelelse kun når underretning.service er indstillet til sms.

Det er værd at nævne det @ConditionalOnProperty har en anden attribut kaldet matchIfMissing. Denne attribut specificerer, om betingelsen skal matche, hvis ejendommen ikke er tilgængelig.

Lad os nu sætte alle brikkerne sammen og skrive en simpel testcase for at bekræfte, at alt fungerer som forventet:

@Test offentlig ugyldigt nårValueSetToEmail_thenCreateEmailNotification () {this.contextRunner.withPropertyValues ​​("notification.service = email") .withUserConfiguration (NotificationConfig.class) .run (context -> {assertThat (context) .hasBender ("; email) = context.getBean (EmailNotification.class); assertThat (notificationSender.send ("Hello From Baeldung!")). isEqualTo ("Email Notification: Hello From Baeldung!"); assertThat (context) .doesNotHaveBean ("smsNotification"); }); }

5. Konklusion

I denne korte vejledning fremhævede vi formålet med at bruge @ConditionalOnProperty kommentar. Derefter fremviste vi gennem et praktisk eksempel, hvordan man bruger det til at fylde Springbønner betinget.

Som altid er den fulde kildekode til denne vejledning tilgængelig på GitHub.


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