美文网首页
Spring Boot通过@ConditionalOnPrope

Spring Boot通过@ConditionalOnPrope

作者: Man_10 | 来源:发表于2020-04-13 15:32 被阅读0次

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注解可以灵活配置项目中的多环境配置减少不必要的代码,减低代码耦合,提高编码效率

相关文章

网友评论

      本文标题:Spring Boot通过@ConditionalOnPrope

      本文链接:https://www.haomeiwen.com/subject/kgagmhtx.html