SpringBoot 自动装配原理---源码详解

目录

SpringBoot 自动装配原理

源码流程详解:

1、先看启动类,启动这个main方法,然后调用这个run方法。

2、把 启动类作为参数传进run方法

3、然后看run方法的调用流程,如图,run方法做了很多事情,挑核心的讲,核心点是走到这个 refreshContext(context); 方法

4、refreshContext(context); 就是拿到了 App.class 这个配置类并进行解析。可以理解成是解析这个 @SpringBootApplication 这个注解。

5、@SpringBootApplication 是个组合注解,重点就是如图这三个注解:

配置类注解、启动自动配置的注解、扫描包的注解

6、 @SpringBootConfiguration 这个注解本质是一个配置类而已

7、@ComponentScan :扫描当前包及其子包

8、@EnableAutoConfiguration:重点就是这个注解,用来实现自动转配的功能。

上面说的这个 refreshContext(context); ,其实就是在解析这三个主要的注解。

9、@EnableAutoConfiguration 注解,点进去,里面有 @Import(AutoConfigurationImportSelector.class) 这么个注解,调用了AutoConfigurationImportSelector.class 这个类。

AutoConfigurationImportSelector.class 这个类的重点就是这个方法。

当运行启动类后,会走到这个方法。

打个断点看。在运行启动类的过程中,会调用到这个方法。

getCandidateConfigurations 这个方法返回的是一个list 集合,重点是这个 .loadFactoryNames() 这个 加载工厂名字的方法。

如图:点进 loadFactoryNames 这个类,

通过 classLoader 类加载 这个类 去加载 classpath 里面 META-INF 里面的 spring.factories 配置文件;

读取 jar包中的 / 项目中的 META_INF/Spring.factories 配置文件

获取到的所有的资源是一个集合,封装到 result 里面,里面存的就是各个 spring.factories 文件。

以 mybatis-plus jar包为例:

上面已经说了,在运行启动类的时候,会读取所有的 spring.factories 配置文件。

点开这个spring.factories 配置文件,里面配置了一个自动装配类 ,就是这个 MybatisPlusAutoConfiguration 类,然后会把这个类读取到内存中

这个 com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration 是一个字符串。

然后再看这个 MybatisPlusAutoConfiguration 类。

首先,可以看出这个类就是一个配置类

然后这个类里面有注解 @Bean

表明这个类的作用就是帮我们创建这个 SqlSessionTemplate 对象。

就这么简单。

到此,这整个流程就是一个springboot的自动装配的流程了。

流程总结:

简单来说,项目启动时,通过 启动类的 @SpringBootApplication 注解 ,加载到 @EnableAutoConfiguration 这个启动自动装配 的注解,这个注解会加载到这个AutoConfigurationImportSelector 自动配置导入选择器类 ,这个类里面就有一个方法去读取jar包中的所有的 META-INF/spring.factories 文件 ,然后加载这些文件。

这些 spring.factories 文件里面就配置了对应的一些自动装配的类,以字符串的形式存在,点进这些自动装配类,可以看到这些类贴有@Configuration 注解,表示这个类是一个配置类,然后这个类里面还有一些用 @Bean 注解修饰的方法,表明这个类的作用就是能帮我们自动创建该 Bean对象。

条件匹配解释:

不是每个自动装配类都会生效的。

每个自动配置类都会通过条件注解,用于判断是否满足特定的条件。条件可以是环境变量、配置属性的值、类是否存在等等。如果条件匹配成功,那么这个自动装配类才会生效。

其他解释:

一些条件注解:

@ConditionalOnBean(仅仅在当前上下文中存在某个对象时,才会实例化一个Bean)

@ConditionalOnClass(某个class位于类路径上,才会实例化一个Bean)

@ConditionalOnExpression(当表达式为true的时候,才会实例化一个Bean)

@ConditionalOnMissingBean(仅仅在当前上下文中不存在某个对象时,才会实例化一个Bean)

@ConditionalOnMissingClass(某个class类路径上不存在的时候,才会实例化一个Bean)

@ConditionalOnNotWebApplication(不是web应用)

什么是 External Libraries?

相关推荐
yuanbenshidiaos34 分钟前
c++---------数据类型
java·jvm·c++
向宇it38 分钟前
【从零开始入门unity游戏开发之——C#篇25】C#面向对象动态多态——virtual、override 和 base 关键字、抽象类和抽象方法
java·开发语言·unity·c#·游戏引擎
Lojarro1 小时前
【Spring】Spring框架之-AOP
java·mysql·spring
莫名其妙小饼干1 小时前
网上球鞋竞拍系统|Java|SSM|VUE| 前后端分离
java·开发语言·maven·mssql
isolusion1 小时前
Springboot的创建方式
java·spring boot·后端
Yvemil72 小时前
《开启微服务之旅:Spring Boot Web开发举例》(一)
前端·spring boot·微服务
zjw_rp2 小时前
Spring-AOP
java·后端·spring·spring-aop
Oneforlove_twoforjob2 小时前
【Java基础面试题033】Java泛型的作用是什么?
java·开发语言
TodoCoder2 小时前
【编程思想】CopyOnWrite是如何解决高并发场景中的读写瓶颈?
java·后端·面试
向宇it2 小时前
【从零开始入门unity游戏开发之——C#篇24】C#面向对象继承——万物之父(object)、装箱和拆箱、sealed 密封类
java·开发语言·unity·c#·游戏引擎