Spring boot 中的使用
在spring boot源码中,涉及到http编码的自动装配等大量的使用到了@ConditionalOnProperty的注解。
HttpEncodingAutoConfiguration类中部分源代码:
@Configuration( proxyBeanMethods = false ) @EnableConfigurationProperties({ServerProperties.class}) @ConditionalOnWebApplication( type = Type.SERVLET ) @ConditionalOnClass({CharacterEncodingFilter.class}) @ConditionalOnProperty( prefix = "server.servlet.encoding", value = {"enabled"}, matchIfMissing = true ) public class HttpEncodingAutoConfiguration { ///省略内部代码 }
上面自动配置类中华都是通过@ConditionalOnProperty来控制自动配置是否生效,下面具体了解下源码及具体使用。
@ConditionalOnProperty源码说明
@ConditionalOnProperty注解类源码如下:
package org.springframework.boot.autoconfigure.condition;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.context.annotation.Conditional;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Documented
@Conditional({OnPropertyCondition.class})
public @interface ConditionalOnProperty {
//获取对应的property名称的值, 与name不可同时使用
String[] value() default {};
//配置属性名称前缀
String prefix() default "";
//数值,配置属性完整名称或部分名称
//可与prefix组合使用,组成完整的配置属性名称,与value不能同时使用
String[] name() default {};
//可与name配合使用,比较获取的属性值与havingvalue给定的值是否相同,相同才加载配置
String havingValue() default "";
//缺少该配置属性时是否可以加载,如果是true,没有该配置属性时也会正常加载,反之则不会生效
boolean matchIfMissing() default false;
}
通过注解ConditionalOnProperty上的@Conditional(OnPropertyCondition.class)代码,可以看出ConditionalOnProperty属于@Conditional的衍生注解。生效条件由OnPropertyCondition来进行判断。
@ConditionalOnProperty的核心功能
@ConditionalOnProperty的核心功能是通过属性name以及havingValue来实现的。
name 指定属性名
havingValue 指定属性的值
matchIfMissing 没有指定属性的时候,是否启用configuration,默认不启用
代码实现方式
yml文件:
#my.love.pangdun=true
#xiami.love.pangdun=true
#my.love.xiami=yes
package com.xiami.jdbctemplates.config;
import com.xiami.jdbctemplates.entity.Account;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConditionalOnProperty(prefix = "my.love", value = "xiami", havingValue="yes", matchIfMissing = true)
public class ConditionalOnPropertyConfig {
@Bean
public Account getAccount(){
System.out.println("@@@@ I love XiaMi @@@");
return new Account();
}
}
package com.xiami.jdbctemplates.config;
import com.xiami.jdbctemplates.entity.Account;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConditionalOnProperty(name = "my.love.pangdun", havingValue="true")
public class ConditionalOnPropertyConfig01 {
@Bean
public Account getAccount(){
System.out.println("@@@@ XiaMi love PangDun @@@");
return new Account();
}
}
package com.xiami.jdbctemplates.config;
import com.xiami.jdbctemplates.entity.Account;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConditionalOnProperty(prefix = "xiami.love", value = "pangdun")
public class ConditionalOnPropertyConfig02 {
@Bean
public Account getAccount(){
System.out.println("@@@@ PangDun love XiaMi @@@");
return new Account();
}
}
运行结果: