51好读  ›  专栏  ›  码农小胖哥

Spring Boot 2 实战:根据条件来自动配置不同逻辑的Bean

码农小胖哥  · 掘金  ·  · 2019-10-21 07:09

正文

阅读 6

Spring Boot 2 实战:根据条件来自动配置不同逻辑的Bean

1. 前言

我们经常会有根据条件来加载不同的接口。比如你查询目录下文件列表, Windows 下你会用 CMD dir 命令,而 Linux 下你会使用 ls 命令。 熟悉 Spring Boot 自动配置的也知道 Spring Boot 能根据不同的实际情况启用不同的配置。这就是 @Conditional 注解在发挥作用。该注解指定了在什么条件下创建 Bean 进行配置。

2. @Conditional 注解

Spring Boot 包含多个 @Conditional 注释,可以在 @Configuration 注解的类和 @Bean 注解方法中使用。 @Conditional 类型的注解,可以注解在类上,可以注解在 Bean 方法上,可以允许基于Spring Environment属性包含配置,可以仅允许在存在特定资源时包含配置。也可自定义,接下来我们来熟悉一下 Spring Boot 提供的一些具体的条件注解。

2.1 Class Conditions

@ConditionalOnClass @ConditionalOnMissingClass 两个在类上的注解:

判断指定的类是否存在来构建自动配置,也可使用 name 属性名来指定类名。

2.2 Bean Conditions

@ConditionalOnBean @ConditionalOnMissingBean 两个在 Bean 方法上的注解:

判断指定的 Bean 是否存在来构建自动配置,可以使用 value 属性来按类型或名称(id)指定 Bean , 可以使用 search 属性指定 ApplicationContext 层次结构来搜索 Bean

@Configuration
public class MyAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public MyService myService() { ... }

}复制代码

要添加注意添加 Bean 时的顺序,官方建议在自动配置类上仅使用 @ConditionalOnBean @ConditionalOnMissingBean 注释,因为可以保证这些注释在添加用户定义的Bean后执行。

@ConditionalOnBean @ConditionalOnMissingBean 注解作用在 @Configuration 注释的类上,等同于在作用在每个包含 @Bean 的方法上。

2.3 Property Conditions

@ConditionalOnProperty 注解可以基于Spring Environment属性包含的配置进判断,再决定自动配置的执行,使用 prefix name 属性指定应检查的属性。默认情况下,匹配 存在 且不等于 false 的任何属性。 您还可以使用 havingValue matchIfMissing 属性创建更高级的检查。







请到「今天看啥」查看全文