三、关于自动配置

it2023-02-06  47

前言

在解读@SpringBootApplication中讲到@EnableAutoConfiguration 可以借助 SpringFactoriesLoader将标注了 @Configuration 的 JavaConfig 类 汇总并加载到最终的 ApplicationContext实际上,基于 @EnableAutoConfiguration 的自动配置功能拥有更加强大的调控能力通过配合比如基于条件的自动配置或者调整加载顺序我们可以对自动配置进行更加细粒度的调整和控制

基于条件的自动配置

基于条件的自动配置来源于 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 实现的

这也意味着所有的这些依赖模块都是按需加载的

只有符合某些特定条件,这些依赖模块才会生效

这也就是我们所谓的“智能”自动配置。

调整自动配置的顺序

使用 @AutoConfigureBefore 或者 @AutoConfigureAfter 让当前配置或者组件在某个其他组件之前或者之后进行比如,假设我们希望某些 JMX 操作相关的 bean 定义在 MBeanServer 配置完成之后进行,那么我们就可以提供一个类似如下的配置:
最新回复(0)