1.概述:
SpringBoot通过@ConditionalOnProperty 获取application.yml配置来设置Configuration是否生效
2.接口定义
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Documented
@Conditional(OnPropertyCondition.class)
public @interface ConditionalOnProperty {
String[] value() default {}; //数组,获取对应property名称的值,与name不可同时使用
String prefix() default "";//property名称的前缀,可有可无
String[] name() default {};//数组,property完整名称或部分名称(可与prefix组合使用,组成完整的property名称),与value不可同时使用
String havingValue() default "";//可与name组合使用,比较获取到的属性值与havingValue给定的值是否相同,相同才加载配置
boolean matchIfMissing() default false;//缺少该property时是否可以加载。如果为true,没有该property也会正常加载;反之报错
boolean relaxedNames() default true;// 暂时没用涉及使用
}
}
3.使用场景说明
通过 prefix 和 name以及havingValue 来实现的,其中prefix 和 name以及havingValue用来从application.yml 中读取某个属性值。
如果该值为空,则返回false;
如果值不为空,则将该值与havingValue指定的值进行比较,如果一样则返回true;否则返回false。
如果返回值为false,则该configuration不生效;为true则生效。
4.@ConditionalOnProperty 注解使用
场景:
通过@ConditionalOnProperty注解读取值,来实现redis单机或集群配置
application.yml 配置
springboot_template:
cluster: false #集群配置 true集群环境 false单机环境,还需打开pom.xml里的spring-session-data-redis注释
globalSessionTimeout: 3600 #单机环境,session过期时间为60分钟
redis:
open: false #是否开启redis缓存 true开启 false关闭
使用@ConditionalOnProperty注解读取配置
/**
* 全局会话超时
*/
@Value("${springboot_template.globalSessionTimeout}")
private long globalSessionTimeout;
/**
* 单机环境,session交给shiro管理
* application.yml 文件中 springboot_template.cluster:false 时,执行该方法
*/
@Bean
@ConditionalOnProperty(prefix = "springboot_template", name = "cluster", havingValue = "false")
public DefaultWebSessionManager sessionManager() {
DefaultWebSessionManager sessionManager = new DefaultWebSessionManager ();
/* 开启session会话任务调度效验 */
sessionManager.setSessionValidationSchedulerEnabled ( true );
/* 去掉shiro登录时url里的JSESSIONID */
sessionManager.setSessionIdUrlRewritingEnabled ( false );
/* 会话验证间隔 */
sessionManager.setSessionValidationInterval ( globalSessionTimeout * 1000 );
/* 会话超时 */
sessionManager.setGlobalSessionTimeout ( globalSessionTimeout * 1000 );
return sessionManager;
}
/**
* 集群环境,session交给spring-session管理
* application.yml 文件中 springboot_template.cluster:true 时,执行该方法
*/
@Bean
@ConditionalOnProperty(prefix = "springboot_template", name = "cluster", havingValue = "true")
public ServletContainerSessionManager servletContainerSessionManager() {
return new ServletContainerSessionManager ();
}
通过@ConditionalOnProperty注解可以灵活配置项目中的多环境配置减少不必要的代码,减低代码耦合,提高编码效率
网友评论