De Spring @ConditionalOnProperty-annotatie

1. Overzicht

In deze korte tutorial gaan we het belangrijkste belichten doel van de @ConditionalOnProperty annotatie.

Eerst beginnen we met wat achtergrondinformatie over wat @ConditionalOnProperty is. Vervolgens zullen we enkele praktische voorbeelden bekijken om te helpen begrijpen hoe het werkt en welke functies het met zich meebrengt.

2. Het doel van @ConditionalOnProperty

Typisch, bij het ontwikkelen van op Spring gebaseerde applicaties, we moeten mogelijk een aantal bonen voorwaardelijk maken op basis van de aanwezigheid en de waarde van een configuratie-eigenschap.

We willen bijvoorbeeld een Databron bean om naar een productie- of testdatabase te verwijzen, afhankelijk van of we een eigenschapswaarde instellen op "prod" of "test".

Gelukkig is dat niet zo moeilijk als het op het eerste gezicht lijkt. Het Spring-framework biedt het @ConditionalOnProperty annotatie juist voor dit doel.

Kortom, de @ConditionalOnProperty maakt beanregistratie alleen mogelijk als een omgevingseigenschap aanwezig is en een specifieke waarde heeft. Standaard moet de opgegeven eigenschap zijn gedefinieerd en niet gelijk zijn aan false.

Nu we bekend zijn met het doel van de @ConditionalOnProperty annotatie, laten we dieper graven om te zien hoe het werkt.

3. Het @ConditionalOnProperty Annotatie in de praktijk

Om het gebruik van te illustreren @ConditionalOnProperty, we zullen een eenvoudig notificatiesysteem ontwikkelen. Laten we aannemen dat we e-mailmeldingen willen verzenden om het voorlopig eenvoudig te houden.

Eerst moeten we een eenvoudige service maken om een ​​meldingsbericht te verzenden. Beschouw bijvoorbeeld de Melding Afzender koppel:

openbare interface NotificationSender {String verzenden (String-bericht); }

Laten we vervolgens een implementatie geven van het Melding Afzender interface om onze e-mails te verzenden:

public class EmailNotification implementeert NotificationSender {@Override public String send (String bericht) {return "Email Notification:" + bericht; }}

Laten we nu eens kijken hoe we gebruik kunnen maken van de @ConditionalOnProperty annotatie. Laten we het Melding Afzender bonen zodanig dat deze alleen wordt geladen als de eigenschap kennisgeving.service is gedefinieerd:

@Bean (name = "emailNotification") @ConditionalOnProperty (prefix = "notification", name = "service") openbare NotificationSender notificationSender () {retourneer nieuwe EmailNotification (); }

Zoals we kunnen zien, is de voorvoegsel en naam attributen worden gebruikt om de configuratie-eigenschap aan te duiden die moet worden gecontroleerd.

Ten slotte moeten we het laatste ontbrekende stukje van de puzzel toevoegen. Laten we onze aangepaste eigenschap definiëren in de application.properties het dossier:

notification.service = e-mail

4. Geavanceerde configuratie

Zoals we al hebben geleerd, is de @ConditionalOnProperty annotatie stelt ons in staat bonen voorwaardelijk te registreren, afhankelijk van de aanwezigheid van een configuratie-eigenschap.

We kunnen echter meer doen dan alleen dat met deze annotatie. Dus laten we verkennen!

Stel dat we nog een meldingsservice willen toevoegen, bijvoorbeeld een service waarmee we sms-meldingen kunnen verzenden.

Om dat te doen, moeten we een andere maken Melding Afzender implementatie:

publieke klasse SmsNotification implementeert NotificationSender {@Override public String send (String bericht) {return "SMS Notification:" + bericht; }}

Aangezien we twee implementaties hebben, laten we eens kijken hoe we deze kunnen gebruiken @ConditionalOnProperty om het recht te laden Melding Afzender boon voorwaardelijk.

Voor dit doel biedt de annotatie de HavingValue attribuut. Heel interessant, hetdefinieert de waarde die een eigenschap moet hebben om een ​​specifieke boon aan de Spring-container toe te voegen.

Laten we nu specificeren onder welke voorwaarde we het SmsNotificatie implementatie in de context:

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

Met behulp van de HavingValue attribuut, hebben we duidelijk gemaakt dat we willen laden SmsNotificatie alleen wanneer kennisgeving.service ingesteld op sms.

Dat is het vermelden waard @ConditionalOnProperty heeft een ander kenmerk genaamd matchIfMissing. Dit kenmerk geeft aan of de voorwaarde moet overeenkomen als de eigenschap niet beschikbaar is.

Laten we nu alle stukjes samenvoegen en een eenvoudige testcase schrijven om te bevestigen dat alles werkt zoals verwacht:

@Test openbare leegte whenValueSetToEmail_thenCreateEmailNotification () {this.contextRunner.withPropertyValues ​​("notification.service = email") .withUserConfiguration (NotificationConfig.class) .run (context -> {assertThat (context) .hasBean berichtgeving ("emailNotificationSender"); NotificationSender "); = context.getBean (EmailNotification.class); assertThat (notificationSender.send ("Hallo van Baeldung!")). isEqualTo ("E-mailmelding: Hallo van Baeldung!"); assertThat (context) .doesNotHaveBean ("smsNotification"); }); }

5. Conclusie

In deze korte tutorial hebben we het doel van het gebruik van de @ConditionalOnProperty annotatie. Vervolgens hebben we aan de hand van een praktisch voorbeeld laten zien hoe je het kunt gebruiken om Springbonen voorwaardelijk te laden.

Zoals altijd is de volledige broncode van deze tutorial beschikbaar op GitHub.


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