深入分析 EnableAutoConfiguration
EnableAutoConfiguration 的 主 要 作 用 其 实 就 是 帮 助
springboot 应用把所有符合条件的@Configuration 配置
都加载到当前 SpringBoot 创建并使用的 IoC 容器中。
再回到 EnableAutoConfiguration 这个注解中,我们发现
它的 import 是这样
@Import(AutoConfigurationImportSele
ctor.class)public @interface
EnableAutoConfiguration {
AutoConfigurationImportSelector 是什么?
Enable注解不仅仅可以像前面演示的案例一样很简单的实
现多个 Configuration 的整合,还可以实现一些复杂的场
景,比如可以根据上下文来激活不同类型的 bean,
@Import 注解可以配置三种不同的 class
1. 第一种就是前面演示过的,基于普通 bean 或者带有
@Configuration 的 bean 进行诸如
2. 实现 ImportSelector 接口进行动态注入
3. 实现 ImportBeanDefinitionRegistrar 接口进行动态注入
@EnableAutoConfiguration 注解的实现原理
了解了 ImportSelector 和 ImportBeanDefinitionRegistrar
后,对于 EnableAutoConfiguration 的理解就容易一些了
它会通过 import 导入第三方提供的 bean 的配置类:
AutoConfigurationImportSelector
@Import(AutoConfigurationImportSele
ctor.class)从名字来看,可以猜到它是基于 ImportSelector 来实现
基于动态 bean 的加载功能。之前我们讲过 Springboot
@Enable*注解的工作原理 ImportSelector 接口
selectImports 返回的数组(类的全类名)都会被纳入到
spring 容器中。
那么可以猜想到这里的实现原理也一定是一样的,定位到
AutoConfigurationImportSelector 这个类中的
selectImports 方法
本质上来说,其实 EnableAutoConfiguration 会帮助
springboot 应用把所有符合@Configuration 配置都加载
到当前 SpringBoot 创建的 IoC 容器,而这里面借助了
Spring 框架提供的一个工具类 SpringFactoriesLoader 的
支持。以及用到了 Spring 提供的条件注解
@Conditional,选择性的针对需要加载的 bean 进行条件
过滤
SpringFactoriesLoader
为了给大家补一下基础,我在这里简单分析一下
SpringFactoriesLoader 这个工具类的使用。它其实和
java 中的 SPI 机制的原理是一样的,不过它比 SPI 更好的
点在于不会一次性加载所有的类,而是根据 key 进行加
载。首先, SpringFactoriesLoader 的作用是从
classpath/META-INF/spring.factories 文件中,根据 key 来
加载对应的类到 spring IoC 容器中。
深入理解条件过滤
在分析 AutoConfigurationImportSelector 的源码时,会
先扫描 spring-autoconfiguration-metadata.properties
文件,最后在扫描 spring.factories 对应的类时,会结合
前面的元数据进行过滤,为什么要过滤呢? 原因是很多
的@Configuration 其实是依托于其他的框架来加载的,
如果当前的 classpath 环境下没有相关联的依赖,则意味
着这些类没必要进行加载,所以,通过这种条件过滤可以
有效的减少@configuration 类的数量从而降低
SpringBoot 的启动时间。
Conditional 中的其他注解