Spring Boot 2.x实战8 - Spring 5.x基础6 - @Conditional

2.8 条件配置 - @Conditional

通过@Conditional我们可以定义当满足某个特定条件(Condition)时,相应的做什么配置。@Conditional同样也可以使用在@Component等、@Configuration@Bean一起使用,进而也指定了条件起作用的范围。

@Conditional注解接受Condition数组作为参数,Condition即我们的特定条件,Condition只有一个方法matches,符合条件时返回true,不符合时返回false。

如我们判断当前系统是否是Windows的条件定义如下:

public class OnWindowsCondition implements Condition { //1
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { //2 
        String osName = context.getEnvironment().getProperty("os.name"); //3
        if(osName.indexOf("win")>=0)
            return true;
        else
            return false;
    }
}
  1. 条件实现Condition接口即可;
  2. matches的两个参数:ConditionContext可获得容器的相关信息;AnnotatedTypeMetadata是当前被注解的方法或类的元数据(数据的描述)信息。
  3. 通过容器context获得运行环境Environment信息,从而获得操作系统信息。

那我们的配置如下:

@Configuration
public class SystemAutoConfig {

    @Bean
    @Conditional(OnWindowsCondition.class) // 1
    public CommandService windows(){
        return new CommandService("dir");
    }
}
  1. 我们的@Conditional使用的是OnWindowsCondition条件,只有符合操作系统是Windows的情况下,当前的Bean才会创建。

我们在JavaConfig使用CommandLineRunner运行:

@Bean
CommandLineRunner windowsConditionalClr(CommandService windows){
    return args -> windows.list();
}

在Windows系统才能正常执行;在非Windows系统下会报找不到Bean的错误,因为不符合条件根本就没有创建这个Bean。

新书推荐:
我的新书《从企业级开发到云原生微服务:Spring Boot 实战》已出版,内容涵盖了丰富Spring Boot开发的相关知识
购买地址:https://item.jd.com/12760084.html

在这里插入图片描述

主要包含目录有:

第一章 初识Spring Boot(快速领略Spring Boot的美丽)
第二章 开发必备工具(对常用开发工具进行介绍:包含IntelliJ IDEA、Gradle、Lombok、Docker等)
第三章 函数式编程
第四章 Spring 5.x基础(以Spring 5.2.x为基础)
第五章 深入Spring Boot(以Spring Boot 2.2.x为基础)
第六章 Spring Web MVC
第七章 数据访问(包含Spring Data JPA、Spring Data Elasticsearch和数据缓存)
第八章 安全控制(包含Spring Security和OAuth2)
第九章 响应式编程(包含Project Reactor、Spring WebFlux、Reactive NoSQL、R2DBC、Reactive Spring Security)
第十章 事件驱动(包含JMS、RabbitMQ、Kafka、Websocket、RSocket)
第11章 系统集成和屁股里(包含Spring Integration和Spring Batch)
第12章 Spring Cloud与微服务
第13章 Kubernetes与微服务(包含Kubernetes、Helm、Jenkins、Istio)
多谢大家支持。

发布了116 篇原创文章 · 获赞 10 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/wiselyman/article/details/105733725