关于 @EnableAutoConfiguration 的一点儿粗浅认识

我们通过 @EnableAutoConfiguration 注解来指定当前应用(springboot 项目)是可以自动配置的

那都需要自动配置些什么呢?

这里我们要提一下 spring-boot-autoconfigure.jar,通过该 jar 提供的很多自动配置的配置类,让我们在使用 springboot 的时候更加简单方便(省去了很多麻烦的配置),而那些自动配置的配置类是在 jar 包中的 META-INF/spring.factories 文件所体现的,如下图下:
关于 @EnableAutoConfiguration 的一点儿粗浅认识
"org.springframework.boot.autoconfigure.EnableAutoConfiguration=…"对应的类列表就是要进行自动配置的配置类(带 @Configuration 注解的类)。

其实,无论是 springboot 提供的 starter,还是第三方提供的 starter,还是我们自定义的 starter, 都是通过这个机制来实现 starter 中的配置类自动加载的。

那 springboot 是如何做到这一点的呢?

让我们从头开始捋(从 @SpringBootApplication 开始)吧!
关于 @EnableAutoConfiguration 的一点儿粗浅认识
关于 @EnableAutoConfiguration 的一点儿粗浅认识
关于 @EnableAutoConfiguration 的一点儿粗浅认识
从 @SpringBootApplication -> @EnableAutoConfiguration -> @Import({AutoConfigurationImportSelector.class}),这里起到关键作用是 AutoConfigurationImportSelector ,而关键中的关键就是该类中出现的 SpringFactoriesLoader ,我在这里引用《SpringBoot解密》中的一段儿话来说明 SpringFactoriesLoader 原本的用途。

SpringFactoriesLoader
属于 Spring 框架私有的一种扩展方案(类似于 Java 的 SPI 方案 java.util.ServiceLoad),其主要功能就是从指定的配置文件中(METF-INF/spring.factories)加载配置,spring.factories 是一个典型的 java
properties,配置的格式为 Key = Value 形式,只不过 Key 和 Value 都是java类型的完整类名(Full
qualified name),比如:
example.MyService=example.MyServiceImpl1,example.MyServiceImpl2
然后框架就可以根据某个类型作为 Key 来查找相对应的类型名称列表了。

在 @EnableAutoConfiguration 这个场景下(SpringFactoriesLoader 的用途稍微有些不同),SpringFactoriesLoader 要从当前应用 classpath 下所有 META-INF/spring.factories 文件中(例如:当前应用引入的 spring-boot-autoconfigure.jar、spring-boot-starter-xxx、xxx-spring-boot-starter 等等),以 org.springframework.boot.autoconfigure.EnableAutoConfiguration 作为查找的 Key,获取对应的所有配置类。然后,springboot 会自动将这些配置类中的「bean 定义」装载到 IoC 容器中。

OK,以上就是我对「自动配置」的一点儿粗浅认识了 ~~