美文网首页
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