看完,SpringBoot自动配置你就懂了!

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

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

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

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

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

看到这里,我们可以通过 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 声明了哪些自动配置,

通过 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 部分源码。

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


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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值