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
属性创建更高级的检查。