Рубрики
Без рубрики

Аннотация Spring @ConditionalOnProperty

Узнайте все об аннотации Spring @ConditionalOnProperty.

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