Использование аннотации @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》