Spring Boot 系列教程(一)@ConditionalOnProperty使用详解

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();
    }
}

运行结果:

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值