Автор оригинала: Abderrahim Azhrioun.
1. Обзор
В этом коротком уроке мы прольем свет на основную цель @ConditionalOnProperty аннотации .
Во-первых, мы начнем с небольшой информации о том, что такое @ConditionalOnProperty . Затем мы рассмотрим несколько практических примеров, которые помогут понять, как это работает и какие функции оно приносит.
2. Цель @ConditionalOnProperty
Как правило, при разработке приложений на основе Spring нам может потребоваться создать некоторые компоненты условно на основе наличия и значения свойства конфигурации .
Например, мы можем зарегистрировать источник данных компонент, чтобы указать на производственную или тестовую базу данных, в зависимости от того, задано ли значение свойства “prod” или “test”.
К счастью, достичь этого не так сложно, как может показаться на первый взгляд. Фреймворк Spring предоставляет аннотацию @ConditionalOnProperty именно для этой цели.
Короче говоря, свойство @ConditionalOnProperty включает регистрацию компонента только в том случае, если свойство среды присутствует и имеет определенное значение. По умолчанию указанное свойство должно быть определено и не равно false .
Теперь, когда мы знакомы с назначением аннотации @ConditionalOnProperty , давайте копнем глубже, чтобы увидеть, как она работает.
3. Аннотация @ConditionalOnProperty на практике
Чтобы проиллюстрировать использование @ConditionalOnProperty, мы разработаем базовую систему уведомлений. Чтобы пока все было просто, давайте предположим, что мы хотим отправлять уведомления по электронной почте.
Во-первых, нам нужно будет создать простой сервис для отправки уведомления. Например, рассмотрим интерфейс Отправитель уведомлений :
public interface NotificationSender {
String send(String message);
}Далее, давайте представим реализацию интерфейса Отправитель уведомлений для отправки наших электронных писем:
public class EmailNotification implements NotificationSender {
@Override
public String send(String message) {
return "Email Notification: " + message;
}
}Теперь давайте посмотрим, как использовать аннотацию @ConditionalOnProperty . Давайте настроим Отправитель уведомлений bean таким образом, чтобы он загружался только в том случае, если свойство notification.сервис определен :
@Bean(name = "emailNotification")
@ConditionalOnProperty(prefix = "notification", name = "service")
public NotificationSender notificationSender() {
return new EmailNotification();
}Как мы видим, атрибуты prefix и name используются для обозначения свойства конфигурации, которое должно быть проверено .
Наконец, нам нужно добавить последний недостающий фрагмент головоломки. Давайте определим наше пользовательское свойство в файле application.properties:
notification.service=email
4. Расширенная конфигурация
Как мы уже узнали, аннотация @ConditionalOnProperty позволяет нам регистрировать бобы условно в зависимости от наличия свойства конфигурации.
Однако мы можем сделать больше, чем просто это с помощью этой аннотации . Итак, давайте исследуем!
Предположим, мы хотим добавить еще одну службу уведомлений — например, службу, которая позволит нам отправлять SMS-уведомления.
Для этого нам нужно создать еще один Отправитель уведомлений реализация:
public class SmsNotification implements NotificationSender {
@Override
public String send(String message) {
return "SMS Notification: " + message;
}
}Поскольку у нас есть две реализации, давайте посмотрим, как мы можем использовать @ConditionalOnProperty для загрузки правильного NotificationSender bean условно.
Для этой цели в аннотации указан атрибут имеющий значение . Довольно интересно, что it определяет значение, которое должно иметь свойство для добавления определенного компонента в контейнер Spring|/.
Теперь давайте уточним, при каких условиях мы хотим зарегистрировать Sms-уведомление реализацию в контексте:
@Bean(name = "smsNotification")
@ConditionalOnProperty(prefix = "notification", name = "service", havingValue = "sms")
public NotificationSender notificationSender2() {
return new SmsNotification();
}С помощью атрибута having Value мы ясно дали понять, что хотим загружать Sms-уведомление только тогда, когда уведомление.сервис установлен в sms .
Стоит отметить, что @ConditionalOnProperty имеет еще один атрибут, называемый matchIfMissing . Этот атрибут указывает, должно ли условие совпадать в случае, если свойство недоступно .
Теперь давайте соберем все части вместе и напишем простой тест, чтобы подтвердить, что все работает так, как ожидалось:
@Test
public void whenValueSetToEmail_thenCreateEmailNotification() {
this.contextRunner.withPropertyValues("notification.service=email")
.withUserConfiguration(NotificationConfig.class)
.run(context -> {
assertThat(context).hasBean("emailNotification");
NotificationSender notificationSender = context.getBean(EmailNotification.class);
assertThat(notificationSender.send("Hello From Baeldung!")).isEqualTo("Email Notification: Hello From Baeldung!");
assertThat(context).doesNotHaveBean("smsNotification");
});
}5. Заключение
В этом коротком уроке мы выделили цель использования @ConditionalOnProperty аннотации . Затем мы продемонстрировали на практическом примере, как использовать его для условной загрузки пружинных бобов.
Как всегда, полный исходный код этого учебника доступен на GitHub .