基于条件的自动配置来源于 Spring 框架中“基于条件的配置”这一特性
在 Spring 框架中,我们可以使用 @Conditional 这个 Annotation 配合 @Configuration 或者 @Bean 等 Annotation
来干预一个配置或者 bean 定义 是否能够生效
其最终实现的效果或者语义类似于如下伪代码:
if(符合 @Conditional 规定的条件){ 加载当前配置(enable current Configuration)或者注册当前bean定义; }
要实现基于条件的配置,我们只要通过 @Conditional 指定自己的 Condition 实现类就可以了(可以应用于类型 Type 的标注或者方法 Method 的标注): @Conditional({MyCondition1.class, MyCondition2.class, …})
最主要的是,@Conditional 可以作为一个 Meta Annotation 用来标注其他 Annotation 实现类,从而构建各色的复合 Annotation
比如 SpringBoot 的 autoconfigure 模块就基于这一优良的革命传统,实现了一批 Annotation(位于 org.springframework.boot.autoconfigure.condition 包下)
有了这些复合 Annotation 的配合,我们就可以结合 @EnableAutoConfigurationn 实现基于条件的自动配置了。
SpringBoot 能够风靡,很大一部分功劳需要归功于它预先提供的一系列自动配置的依赖模块
而这些依赖模块都是基于以上 @Conditional 复合 Annotation 实现的
这也意味着所有的这些依赖模块都是按需加载的
只有符合某些特定条件,这些依赖模块才会生效
这也就是我们所谓的“智能”自动配置。