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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值