spring boot自动配置的实现原理——@Conditional

spring 4中引入了@Conditional注解,可以让spring在满足特定条件时才将一个类注册到spring容器中,具体的条件由org.springframework.context.annotation.Condition接口来描述,该接口的定义如下

@FunctionalInterface
public interface Condition {
    boolean matches(ConditionContext var1, AnnotatedTypeMetadata var2);
}

让我们先写一个自定义的Condition来试一下。假设我希望如果当前classpath中如果包含了mysql-connector的类的话,条件就成立,我可以定义这么一个类

public class MysqlCondition implements Condition {
    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        try{
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            return false;
        }
        return true;
    }
}

这就是一个自定义的Condition。接下来,如果我希望如果当前classpath中如果包含了mysql-connector的类的话,我就向spring中注入一个String字符串


import com.example.springbootstart.conditions.MysqlCondition;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ConditionalConfig {

    @Conditional(MysqlCondition.class)
    @Bean
    public String hello(){
        return "hello, i am here";
    }
}

以上是spring基于java的配置。如果MysqlCondition条件成立,则注入一个String类型的bean,name=hello

这就是spring@Conditional的简单用法,由于所谓的Condition是通过一个接口来描述的,所以开发人员可以定义各种各样的condition。spring还内置了一些比较常用的Condition

Conditions描述
@ConditionalOnBean / @ConditionalOnMissingBean是否存在某个类型或name的bean
@ConditionalOnClass / @ConditionalOnMissingClass当前classpath是否存在某个类型
@ConditionalOnResource当前classpath是否存在某个资源文件
@ConditionalOnProperty当前jvm是否包含某个系统属性为某个值
@ConditionalOnWebApplication当前spring context是否是web应用程序

如果不自定义上面的@ConditionalOnClass,可以直接使用@ConditionalOnClass(name = {"com.mysql.jdbc.Driver"})来达到同样的目的

@Configuration
public class ConditionalConfig {

    //    @Conditional(MysqlCondition.class)
    @ConditionalOnClass(name = {"com.mysql.jdbc.Driver"})
    @Bean
    public String hello() {
        return "hello, i am here";
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值