Подробное объяснение использования @ConditionalOnProperty в Spring Boot

Java

Использование аннотации @ConditionalOnProperty часто можно увидеть в автоматической конфигурации Spring Boot.Эта статья поможет вам понять функцию этой аннотации.

Использование в весенней загрузке

В исходном коде Spring Boot широко используется аннотация @ConditionalOnProperty, например автоматическая настройка кодировки Http и автоматическая настройка типа источника данных.

Часть исходного кода в классе HttpEncodingAutoConfiguration:

@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(HttpProperties.class)
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnClass(CharacterEncodingFilter.class)
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {
    // 省略内部代码
}

Часть кода в классе DataSourceConfiguration:

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(org.apache.tomcat.jdbc.pool.DataSource.class)
@ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "org.apache.tomcat.jdbc.pool.DataSource",
        matchIfMissing = true)
static class Tomcat {
  // 省略内部代码
}

Очевидно, что @ConditionalOnProperty используется для управления тем, действует ли автоматическая конфигурация в двух вышеупомянутых классах автоматической конфигурации.Давайте взглянем на его исходный код и конкретное использование.

Описание исходного кода @ConditionalOnProperty

Исходный код класса аннотации @ConditionalOnProperty выглядит следующим образом:

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Documented
@Conditional(OnPropertyCondition.class)
public @interface ConditionalOnProperty {

    // 数组,获取对应property名称的值,与name不可同时使用
    String[] value() default {};

    // 配置属性名称的前缀,比如spring.http.encoding
    String prefix() default "";

    // 数组,配置属性完整名称或部分名称
    // 可与prefix组合使用,组成完整的配置属性名称,与value不可同时使用
    String[] name() default {};

    // 可与name组合使用,比较获取到的属性值与havingValue给定的值是否相同,相同才加载配置
    String havingValue() default "";

    // 缺少该配置属性时是否可以加载。如果为true,没有该配置属性时也会正常加载;反之则不会生效
    boolean matchIfMissing() default false;

}

В исторической версии также есть атрибут RelaxNames:

//是否可以松散匹配
boolean relaxedNames() default true;

Это свойство больше не существует в последней версии.

Аннотируя код @Conditional(OnPropertyCondition.class) в ConditionalOnProperty, можно увидеть, что ConditionalOnProperty принадлежит производной аннотации @Conditional. Эффективное условие оценивается OnPropertyCondition.

инструкции

Что касается использования @ConditionalOnProperty, мы видели его использование в Spring Boot выше.

Основная функция @ConditionalOnProperty реализуется по имени атрибута и его значению.

Сначала посмотрите на свойство matchIfMissing, которое используется для указания обработки по умолчанию, если соответствующая настройка свойства не выполняется в файле конфигурации: по умолчанию matchIfMissing имеет значение false, то есть, если свойство не настроено, автоматическая настройка не вступит в силу. Если matchIfMissing имеет значение true, это означает, что при отсутствии соответствующей конфигурации атрибута по умолчанию вступает в силу автоматическая конфигурация.

Давайте посмотрим на свойство name, которое используется для чтения значения свойства из application.properties. Например, приведенная выше автоматическая настройка Tomcat находится в файле конфигурации:

spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource

Когда matchIfMissing имеет значение false, если значение имени пусто, вернуть false; если имя не пусто, сравнить значение со значением, указанным с помощью hasValue, если оно такое же, вернуть true, в противном случае вернуть false. Возврат false также означает, что автоматическая настройка не вступит в силу.

Однако, если вы посмотрите на конфигурацию атрибута в классе HttpEncodingAutoConfiguration, вы обнаружите, что имя и HaveValue не используются в полном соответствии с вышеизложенным. Он настроен с "prefix+value" в качестве имени свойства:

spring.http.encoding.enabled=true

Префикс указывает унифицированный префикс «spring.http.encoding» конфигурации, а значение указывает конкретное имя свойства как «включено». Здесь не задается значение haveValue, если не указать значение haveValue, то в силу вступит значение, заданное в конфигурации атрибута по умолчанию (как настроено выше), а false не вступит в силу.

Оригинальная ссылка: "Подробное объяснение использования @CONDITIONALONPROPERTY в SPRING BOOT


Программа Новые Горизонты: Захватывающие и растущие нельзя пропустить

程序新视界-微信公众号