一句话说明自动化配置: 最主要的注解就是@EnableAutoConfiguration,而这个注解会导入一个 EnableAutoConfigurationImportSelector 的类,而这个类会去读取一个 spring.factories 下 key 为 EnableAutoConfiguration 全限定名对应值,进行 Config 类的配置。
SpringBoot 自动配置模块实现

SpringBoot 自动配置模块
该配置模块的主要使用到了 SpringFactoriesLoader,即 Spring 工厂加载器,该对象提供了 loadFactoryNames 方法,入参为 factoryClass 和 classLoader,即需要传入上图中的工厂类名称和对应的类加载器,方法会根据指定的 classLoader,加载该类加器搜索路径下的指定文件,即 spring.factories 文件,传入的工厂类为接口,而文件中对应的类则是接口的实现类,或最终作为实现类,所以文件中一般为如下图这种一对多的类名集合,获取到这些实现类的类名后,loadFactoryNames 方法返回类名集合,方法调用方得到这些集合后,再通过反射获取这些类的类对象、构造方法,最终生成实例

下图有助于我们形象理解自动配置流程

mybatis-spring-boot-starter、spring-boot-starter-web 等组件的 META-INF 文件下均含有 spring.factories 文件,自动配置模块中,SpringFactoriesLoader 收集到文件中的类全名并返回一个类全名的数组,返回的类全名通过反射被实例化,就形成了具体的工厂实例,工厂实例来生成组件具体需要的 bean。
之前我们提到了 EnableAutoConfiguration 注解,其类图如下

可以发现其最终实现了 ImportSelector(选择器) 和 BeanClassLoaderAware(bean 类加载器中间件),重点关注一下 AutoConfigurationImportSelector 的 selectImports 方法

该方法在 springboot 启动流程——bean 实例化前被执行,返回要实例化的类信息列表。我们知道,如果获取到类信息,spring 自然可以通过类加载器将类加载到 jvm 中,现在我们已经通过 spring-boot 的 starter 依赖方式依赖了我们需要的组件,那么这些组建的类信息在 select 方法中也是可以被获取到的,我们继续向下分析







