SpringBoot自动配置源码分析|理解SpringBoot自动配置原理|SpringBoot是如何自动配置的|SpringBoot基本原理

今天是20220503,五一假期的倒数第二天,我在为实习租的小房间里写下第一篇源码总结笔记。后来人,我们一起共勉,加油。


注:当前SpringBoot版本:2.6.7,不同的版本源代码会有不同,但核心思想不会变化很大,建议大家自己点进源码/Debug看一下

我们常常说SpringBoot有自动配置的功能,那自动配置体现在哪里了?我们接下来细细探讨。


我的疑问

@CompentScan和@AutoConfigurationPackage是不是作用重复了?

干货总结

  • 这里画了一张流程图,帮助大家理解。回顾的时候只要脑子里有图的样子,每个节点是做什么用的,基本就够了。
    SpringBoot自动配置源码分析|理解SpringBoot自动配置原理|SpringBoot是如何自动配置的|SpringBoot基本原理_第1张图片

  • 众所周知,我们的SpringBoot项目都有一个主启动类,我们随便拿一个正在用的项目观察一下它的主启动类
    SpringBoot自动配置源码分析|理解SpringBoot自动配置原理|SpringBoot是如何自动配置的|SpringBoot基本原理_第2张图片
  • 这里有一个注解@SpringBootApplication,自动配置的故事也从这里展开。
  • 我们(按住ctrl+鼠标左击)进入其中。
    SpringBoot自动配置源码分析|理解SpringBoot自动配置原理|SpringBoot是如何自动配置的|SpringBoot基本原理_第3张图片
  • 除了元注解@Target @Retention @Documented@Inherited(如果⼀个类⽤上了@Inherited修饰的注解,那么其子类也会继承这个注解)之外,
    1.@SpringBootConfiguration
    2.@EnableAutoConfiguration
    3.@ComponentScan
    是我们需要重点关注的内容。

1.先看 SpringBootConfiguration,我们发现它加了@Configuration注解,代表它所标注的我们的主启动类也是一个Spring的配置类。
SpringBoot自动配置源码分析|理解SpringBoot自动配置原理|SpringBoot是如何自动配置的|SpringBoot基本原理_第4张图片

2.然后是@EnableAutoConfiguration
SpringBoot自动配置源码分析|理解SpringBoot自动配置原理|SpringBoot是如何自动配置的|SpringBoot基本原理_第5张图片

  • 我们需要重点关注的是
    @AutoConfigurationPackage
    @Import(AutoConfigurationImportSelector.class)

自动配置包原理

①自动配置包原理:进入@AutoConfigurationPackageSpringBoot自动配置源码分析|理解SpringBoot自动配置原理|SpringBoot是如何自动配置的|SpringBoot基本原理_第6张图片
我们发现它通过@Import导入了一个Register.class,再进入
SpringBoot自动配置源码分析|理解SpringBoot自动配置原理|SpringBoot是如何自动配置的|SpringBoot基本原理_第7张图片

  • 这里我们打一个断点进行辅助分析。
  • AnnotationMetada是注解元信息的意思,我们的注解@AutoCOnfigurationPackage注到了哪,因为合成注解的作用(一个@interface标注的原注解上@了多个注解,则该注解可以起到多个注解的作用),所以它最终是注到了我们的主启动类上,我们可以通过Evaluate(打断点Debug后,右键Evaluate)来验证。
    SpringBoot自动配置源码分析|理解SpringBoot自动配置原理|SpringBoot是如何自动配置的|SpringBoot基本原理_第8张图片
  • register是注册的意思,那么它想注册什么呢?我们仍然Evaluate一下,发现它把主要启动类所在的所有包注册进了Spring容器。SpringBoot自动配置源码分析|理解SpringBoot自动配置原理|SpringBoot是如何自动配置的|SpringBoot基本原理_第9张图片

①总结:@AutoConfigurationPackage注解将主启动类所在包及其所有的子包批量注册进了Spring容器。

自动配置原理

②自动配置原理@Import(AutoConfigurationImportSelector.class),我们点击进入,发现了一系列的层级关系,一个方法调用另一个方法来获取参数,如下:
SpringBoot自动配置源码分析|理解SpringBoot自动配置原理|SpringBoot是如何自动配置的|SpringBoot基本原理_第10张图片
SpringBoot自动配置源码分析|理解SpringBoot自动配置原理|SpringBoot是如何自动配置的|SpringBoot基本原理_第11张图片

  • 通过多层的溯源,我们发现他最终定位到了META-INF/spring.factories这样一个文件。这个文件很关键!
  • 我们可以在External Libraries下找到spring-boot-autoconfigure-2.3.4.RELEASE.jar这个jar包,这个jar包也是我们自动装配的核心原理。
    SpringBoot自动配置源码分析|理解SpringBoot自动配置原理|SpringBoot是如何自动配置的|SpringBoot基本原理_第12张图片
  • 我们点击,发现里面有非常多的xxxxAutoConfiguraion。也就是说,SpringBoot启动的时候,通过@Import(AutoConfigurationImportSelector.class)溯源到META-INF/spring.factories这样一个文件,加载了所有的配置类。总共127个
    SpringBoot自动配置源码分析|理解SpringBoot自动配置原理|SpringBoot是如何自动配置的|SpringBoot基本原理_第13张图片
  • 但是呢,虽然这些组件全部被加载了,但是并没有全部生效,原因就在于@Conditional注解->条件装配只有满足条件的配置类才会注入到IOC容器中并生效
  • 我们来举例说明
    • WebMvcAutoConfiguration中ConditionalOn的条件都成立,所以WebMvc是生效的。SpringBoot自动配置源码分析|理解SpringBoot自动配置原理|SpringBoot是如何自动配置的|SpringBoot基本原理_第14张图片
    • 再比如说AopAutoConfiguration ,AOP这一个类中有两个子类,对应着两种AOP的实现方法。
    • AOP主类默认是有值的(havingValue=true),即使没有配值,它也会给你设置为true(matchIfMissing=true),所以AOP这个主类能生效。
    • 第一个子类因为Advice这个类没有导入,所以不能生效。
    • 而第二个子类条件都满足,所以可以生效。
      SpringBoot自动配置源码分析|理解SpringBoot自动配置原理|SpringBoot是如何自动配置的|SpringBoot基本原理_第15张图片

所以总结自动配置原理:②@Import(AutoConfigurationImportSelector.class)通过加载META-INF/spring.factories,自动加载其中的配置类,又根据@Conditional的条件装配原理,有选择的将组件加载到容器中并生效。


3.最后一个@ComponentScan是指定了包扫描的路径,主程序所在包及其下面的所有子包里面的组件都会被默认扫描进来,只不过它显示的声明了两个过滤条件。
SpringBoot自动配置源码分析|理解SpringBoot自动配置原理|SpringBoot是如何自动配置的|SpringBoot基本原理_第16张图片

你可能感兴趣的:(源码学习,spring,boot,java,spring)