Автор оригинала: 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 .