- 前言
我们经常会有根据条件来加载不同的接口。比如你查询目录下文件列表, 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属性创建更高级的检查。
2.4 Resource Conditions
@ConditionalOnResource注释仅允许在存在特定资源时执行自动配置。 可以使用常用的 Spring 约定来指定资源,如以下示例所示:file:/home/user/test.dat。
2.5 Web