SpringBoot 条件注解

Posted *King*

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot 条件注解相关的知识,希望对你有一定的参考价值。

@Conditional表示仅当所有指定条件都匹配时,组件才有资格注册 。

@Conditional的使用

  • 作为任何@Bean方法的方法级注释

  • 作为任何类的直接或间接注释的类型级别注释 @Component,包括@Configuration类

  • 作为元注释,目的是组成自定义构造型注释

常用的条件注解:

  • @Conditional 依赖的条件
  • @ConditionalOnBean 在某个Bean存在的条件下
  • @ConditionalOnMissingBean 在某个Bean不存在的条件下
  • @ConditionalOnClass 在某个Class存在的条件下
  • @ConditionalOnMissingClass 在某个Class不存在的条件下

例1:判断当前操作系统

定义接口

SysService

public interface SysService {
    String show();
}

定义两个实现类

LinuxService

public class LinuxService implements SysService {
    @Override
    public String show() {
        return "我是Linux系统";
    }
}

WindowsService

public class WindowsService implements SysService {
    @Override
    public String show() {
        return "我是Windows系统";
    }
}

定义两个条件类

LinuxCondition

public class LinuxCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        String sysName = context.getEnvironment().getProperty("os.name");
        if(sysName.contains("Linux")){
            return true;
        }
        return false;
    }
}

WindowsCondition

public class WindowsCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        String sysName = context.getEnvironment().getProperty("os.name");
        if(sysName.contains("Windows")){
            return true;
        }
        return false;
    }
}

定义条件配置类

使用@Conditional注解,对象需要实现Condition接口,Condition 接口是一个函数式接口

ConditionConfig

@Configuration
public class ConditionConfig {

    @Bean
    @Conditional(WindowsCondition.class)
    public SysService windowsService(){
        return new WindowsService();
    }

    @Bean
    @Conditional(LinuxCondition.class)
    public SysService linuxService(){
        return new LinuxService();
    }
}

测试类:

Test

public class Test {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConditionConfig.class);
        SysService sysService = context.getBean(SysService.class);
        String sysName = context.getEnvironment().getProperty("os.name");
        System.out.println("当前的操作系统是:"+sysName);
        System.out.println("调用方法打印的系统是:"+sysService.show());
    }
}

运行结果:

例2:动态配置mysql或者Oracle数据源

配置文件里配置参数

db-type=oracle

定义Condition类

MySQLCondition

public class MySQLCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return "mysql".equals(context.getEnvironment().getProperty("db-type"));
    }
}

OracleConditon

public class OracleConditon implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return "oracle".equals(context.getEnvironment().getProperty("db-type"));
    }
}

定义JdbcFactory接口

public interface JdbcFactory {
    void create();
}

默认的Mysql和Oracle实现

MySQLFactory

@ConditionalOnMissingBean(value = JdbcFactory.class,ignored = MySQLFactory.class)
@Conditional(MySQLCondition.class)
@Component
public class MySQLFactory implements JdbcFactory{
    @Override
    public void create() {
        System.out.println("I am mysql");
    }
}

OracleFactory

@ConditionalOnMissingBean(value = JdbcFactory.class,ignored = OracleFactory.class)
@Conditional(OracleConditon.class)
@Component
public class OracleFactory implements JdbcFactory{
    @Override
    public void create() {
        System.out.println("I am oracle");
    }
}

测试

@SpringBootTest
public class Test02 {
    @Resource
    private JdbcFactory jdbcFactory;

    @Test
    public void test02(){
        jdbcFactory.create();
    }
}

");
}
}

![在这里插入图片描述](https://img-blog.csdnimg.cn/435482730bc54ffd89649dc3d9115229.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA77yKS2luZ--8ig==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)

以上是关于SpringBoot 条件注解的主要内容,如果未能解决你的问题,请参考以下文章

难以想象SpringBoot中的条件注解底层居然是这样实现的

springboot条件注解源码分析

助力SpringBoot自动配置的条件注解ConditionalOnXXX分析--SpringBoo

SpringBoot 条件注解

SpringBoot 如何自定义自己的条件注解与自动配置?

springboot学习(二十二)_ 使用@Constraint注解自定义验证注解