SpringBoot 框架可用于创建可执行的 Spring 应用程序,采用了习惯优于配置的方法。其中奥秘在于 @EnableAutoConfiguration 注释,此注释自动载入应用程序所需的所有 Bean——这依赖于 SpringBoot 在类路径中的查找。
1. @SpringBootApplication
首先来看 @SpringBootApplication 注解:
1 | package org.springframework.boot.autoconfigure; |
该注解上存在元注解@EnableAutoConfiguration,这就是 Spring Boot 自动配置实现的核心入口,其定义为:
1 | ("deprecation") |
可见通过@Import注解,引入了EnableAutoConfigurationImportSelector。
2. @EnableAutoConfigurationImportSelector
1 | public class EnableAutoConfigurationImportSelector |
父类 AutoConfigurationImportSelector 的 selectImports 方法如下:
1 | public String[] selectImports(AnnotationMetadata metadata) { |
该方法使用了 Spring Core 包的 SpringFactoriesLoader 类的 loadFactoryNamesof() 方法,查询 META-INF/spring.factories 文件下以 EnableAutoConfiguration 的全限定名(org.springframework.boot.autoconfigure.EnableAutoConfiguration)为 key 的对应值,其结果为:
1 | # Auto Configure |
在这个文件中,可以看到一系列 Spring Boot 自动配置的列表。
3. MongoAutoConfiguration
以 MongoAutoConfiguration 为例:
1 |
|
这个类进行了简单的 Spring 配置,声明了 MongoDB 所需典型 Bean,并且和其他很多自动配置类一样,重度依赖于 Spring Boot 的注解(@Condition*)。
4. 调试
以 DEBUG 级 log 启动 Springboot 项目,Spring Boot 会产生一个报告,如下:
1 | Positive matches: |
对于每个自动配置,可以看到它启动或失败的原因。