SpringBoot 是个很强大的框架,免去很多繁杂配置,它是怎么实现这些功能的,来看看 SpringBoot 的运行原理。

首先,SpringBoot 启动类是整个项目的启动入口,@SpringBootApplication 注解是整个启动类的核心,可以看一下 @SpringBootApplication 的部分源码。

springboot redission 自动恢复连接 springboot自动配置了什么_java


可以看出 @SpringBootApplication 注解是一个组合注解,主要由 @SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan 等注解组成。但是自动配置的核心功能主要是通过 @EnableAutoConfiguration 注解完成的,可以看一下 @EnableAutoConfiguration 源码。

springboot redission 自动恢复连接 springboot自动配置了什么_Web_02

在 @EnableAutoConfiguration 注解中,关键功能是通过 @Import 注解导入的配置功能,查看 AutoConfigurationImportSelector 类源码。

在这个类中通过 getCandidateConfigurations() 方法扫描 META-INF/spring.factories 文件的 jar 包。

springboot redission 自动恢复连接 springboot自动配置了什么_jar_03


看到这里,我们可以通过 Maven 依赖查看一下 spring-boot-autoconfigure-2.1.7.RELEASE.jar 中 META-INF/spring.factories 文件。spring-boot-autoconfigure-2.1.7.RELEASE.jar 这个 jar 包就是 SpringBoot 主要依赖的自动配置的 jar 包。

springboot redission 自动恢复连接 springboot自动配置了什么_Web_04


从这个文件中可以看出 SpringBoot 声明了哪些自动配置,

springboot redission 自动恢复连接 springboot自动配置了什么_jar_05


通过 spring.factories 上包路径,可以随便点几个进去查看一下源码,发现上面任意一个 AutoConfiguration 文件中,一般都有用到下面的条件注解,这些条件注解在 spring-boot-autoconfigure-2.1.7.RELEASE.jar 中 Condition 包下。

  1. @ConditionOnBean:当容器中有指定的 Bean 的条件下。
  2. @ConditionOnClass:当类路径下有指定的类的条件下。
  3. @ConditionOnExpression:基于 SpEl 表达式作为判断条件。
  4. @ConditionOnJava:基于 JVM 版本作为判断条件。
  5. @ConditionOnJndi:在 JNDI 存在的条件下查找指定的位置。
  6. @ConditionOnMissingBean:当容器中没有指定 Bean 的情况下。
  7. @ConditionOnMissingClass:当类路径下没有指定的类的条件下。
  8. @ConditionOnNotWebApplication:当前项目不是 Web 项目的条件下。
  9. @ConditionOnProperty:指定的属性是否有指定的值。
  10. @ConditionOnResource:类路径是否有指定的值。
  11. @ConditionOnSingleCandidate:当指定 Bean 在容器中只有一个,或者虽然有多个但是指定首选的 Bean。
  12. @ConditionOnWebApplication:当前项目是 Web 项目的情况下。

由于我一般是使用 SpringBoot 创建 Web 项目,所以我们拿 @ConditionOnWebApplication 研究一下,下面是 @ConditionOnWebApplication 部分源码。

springboot redission 自动恢复连接 springboot自动配置了什么_java_06


这里可以看出,@ConditionOnWebApplication 使用 @Conditional 注解,判断条件是 OnWebApplicationCondition,接着看一下 OnWebApplicationCondition 类是怎么构造的。

springboot redission 自动恢复连接 springboot自动配置了什么_Web_07


OnWebApplicationCondition 继承了 SpringBootCondition,该类中最为主要的是 getMatchOutcome() 和 isWebApplication() 两个方法,在我看来,在项目启动时,会调用 getMatchOutcome 匹配当前是否是 Web 项目来加载配置。

大致的 SpringBoot 启动流程就是这样,有不同理解的可以讨论一下。