SpringBoot自动装配源码解析

Spirngboot为啥会比Spring使用更简单,少了那么多的Xml文件?一切都是基于SpringBoot的自动装配,当然SpringBoot的自动装配也是一个高频的面试题。

1.@SpringApplication注解的源码分析

在分析源码时,都要问一问为什么SpringBoot能基于自动装配?
这是一个SpringBoot的项目
SpringBoot自动装配源码解析_第1张图片

1.首先来看下SpringBoot的 @SpringBootApplication注解,在@SpringBootApplication注解下有三个注解,分别是 @SpringBootConfiguration@EnableAutoConfiguration
@ComponentScan

SpringBoot自动装配源码解析_第2张图片

2.查看 @SpringBootConfiguration 底层它其实就是一个 @Configuration注解,学过Spring的都知道 @Configuration 其实就是一个配置类

SpringBoot自动装配源码解析_第3张图片

3.所以不关注这个注解,咱们直接查看 @EnableAutoConfiguration 这个注解

SpringBoot自动装配源码解析_第4张图片

4.直接在进入 @AutoConfigurationPackage 注解下查看 发现又有一个 @Import(AutoConfigurationPackages.Registrar.class)

SpringBoot自动装配源码解析_第5张图片

5.AutoConfigurationPackages 这个类下发现 它调取了getAutoConfigurationEntry()

SpringBoot自动装配源码解析_第6张图片

6.然后这个 getAutoConfigurationEntry() 又调取了getCandidateConfigurations() 这个方法

SpringBoot自动装配源码解析_第7张图片

7.在 getCandidateConfigurations() 这个方法下就2行代码,一行调取了loadFactoryNames() ,另外一个断言判空,但是好像看到一个
META-INF/spring.factories.(spring的发可T锐死)

SpringBoot自动装配源码解析_第8张图片

8.然后咱们看下这个loadFactoryNames()这个方法里做了什么
SpringBoot自动装配源码解析_第9张图片
SpringBoot自动装配源码解析_第10张图片

  1. 由上图咱们看到是加载了一个META-INF下的 spring.factories 然后循环遍历取元素
    这里就咱们看下 spring.factories 是个什么东西。

SpringBoot自动装配源码解析_第11张图片
SpringBoot自动装配源码解析_第12张图片

10 全局搜索咱们发现spring.factories 文件是 spring-boot-autoconfigure下的一个文件
到这里咱们就发现 spring.factories 文件里的信息,它与 POM.xml文件下的 spring-boot-starter-parent 父依赖下加载的启动类maven坐标的包类似
SpringBoot自动装配源码解析_第13张图片
SpringBoot自动装配源码解析_第14张图片
SpringBoot自动装配源码解析_第15张图片

11.然后回到spring.factories文件,咱们随便点击一个类,会发现底层大量的使用了 @Conditional注解@Conditional注解来判断是否加载了spring-boot-starter-xxx之类的依赖,也就是Starter组件

SpringBoot自动装配源码解析_第16张图片

到这里基本就明白为啥SpringBoot能够自动装配了,下面总结梳理一下

总结:Spring Boot通过@EnableAutoConfiguration注解开启自动配置,对spring-boot-autoconfigure的包下的spring.factories文件进行循环扫描,这个文件中包含了可以进行自动配置的类,当满足@Condition注解指定的条件时,便在Starter组件依赖的支持下进行实例化,注册到Spring容器中。

SpringBoot自动装配源码解析_第17张图片

2.SpringApplication.run分析

由于run方法源码过于繁琐,在这里就引用其他大佬的梳理的图作为了解
run() 方法总结为4个步骤:
1、推断应用的类型是普通的项目还是Web项目
2、查找并加载所有可用初始化器 , 设置到initializers属性中
3、找出所有的应用程序监听器,设置到listeners属性中
4、推断并设置main方法的定义类,找到运行的主类

SpringBoot自动装配源码解析_第18张图片
最后:

关于springboot,谈谈你的理解: springboot 主要分: springboot的自动装配和run()
springboot的自动装配:
SpringBoot通过@EnableAutoConfiguration注解开启自动配置,对spring-boot-autoconfigure的包下的spring.factories文件进行循环扫描,这个文件中包含了可以进行自动配置的类,当满足@Condition注解指定的条件时,便在Starter组件依赖的支持下进行实例化,注册到Spring容器中

run():
①判断当前项目是普通项目还是web项目
②推断并设置main方法的定义类,找到运行的主类
③run方法里面有一些监听器,这些监听器是全局存在的,它的作用是获取上下文处理一些bean,所有的bean无论是加载还是生产初始化多存在。

你可能感兴趣的:(SpringBoot,spring,boot,java,spring)