Spring boot源码
2024-07-20 18:19:31 0 举报
AI智能生成
Spring boot源码
作者其他创作
大纲/内容
构建SpringApplication对象实例
原理图
关键点
进行辅助性推断
web 应用类型 Main 类
web 应用类型 Main 类
扫码所有jar中的META-INF/spring.factories
【初始化三方框架扩展点,Spring SPI扩展】
【初始化三方框架扩展点,Spring SPI扩展】
Spring Factories实现原理
在Spring中也有一种类似与Java SPI的加载机制。
它在META-INF/spring.factories文件中配置接口的实现类名称,
然后在程序中读取这些配置文件并实例化。
它在META-INF/spring.factories文件中配置接口的实现类名称,
然后在程序中读取这些配置文件并实例化。
实现类:spring-core包里定义了SpringFactoriesLoader类
检索META-INF/spring.factories文件,并获取指定接口的配置的功能
会遍历整个ClassLoader中所有jar包下的spring.factories文件
会遍历整个ClassLoader中所有jar包下的spring.factories文件
创建spring 容器
入口1
AnnotationConfigServletWebServerApplicationContext
源码扩展点
原理就是用spring的扩展机制去实现的
扩展点入口
加载了自己的扩展类如:spring boot
监听类的获取
会先通过SPI方式获取所有的监听类
EventPublishingRunListener
根据springboot程序启动过程的不同阶段发布对应的事件,进行对应阶段的相关操作
执行SpringApplication对象实例
自动装配机制的例子
ServletWebServerFactoryAutoConfiguration
负责对内嵌的VebServer容器(Tomcat)进行自动装配
负责对内嵌的VebServer容器(Tomcat)进行自动装配
根据classpath,使用EmbeddedTomcat创建TomcatWebServerFactory
构建WebServerFactory的Customizer
注册Customizer的BeanPostProcessor,,后续负责对Factory进行定制化
spring boot源码运行过程中
会执行tomcat构建和启动的流程
内嵌Tomcat启动,可以接收外部发送的http请求
会执行tomcat构建和启动的流程
基于自动装配好的TomcatWebServerFactory,利用Tomcat API组装WebServer
启动组装好的内嵌Tomcat,.监听指定端口号
内嵌Tomcat启动,可以接收外部发送的http请求
spring mvc的DispatcherServlet
DispatcherServletAutoConfiguration
DispatcherServletAutoConfiguration
构造了-个DispatcherServlet
构造了一个DispatcherServletRegistration
提供回调方法,供tomcat在某个时间点来进行回调
回调时传入ServletContext
通过Servlet和Tomcat的原生APL,完成DispatcherServet在tomcat里的注册
DispatcherServlet映射的请求Url是/*
WebMvcAutoConfiguration
对spring mvc的高阶功能进行自动装配
对spring mvc的高阶功能进行自动装配
原理圖
spring boot启动流程中
会去启动Spring容器
spring容器一旦启动成功,则所有的bean全部初始化完毕,系统完成启动
会去启动Spring容器
构建spring容器(真正的容器是第二次构建出来的)
通过执行refresh(context)来正式启动spring容器
注册三方框架的spring后处理器
onRefresh->完成tomcat的初步启动
完成bean工厂的初始化,三方框架和我们自己的bean全部完成实例化
finishRefresh->Tomcati正式启动
spring容器一旦启动成功,则所有的bean全部初始化完毕,系统完成启动
MybatisAutoConfiguration
触发引入自动装配
spring cloud alibaba有一大堆的AutoConfguration
dubbo的自动装配
nacos的自动装配
自动装配实现原理
【需要注解在服务启动加
@EnableAutoConfiguration 才有效】
【需要注解在服务启动加
@EnableAutoConfiguration 才有效】
通过注解@SpringBootApplication=>@EnableAutoConfiguration=>
@Import({AutoConfigurationImportSelector.class})实现自动装配
@Import({AutoConfigurationImportSelector.class})实现自动装配
AutoConfigurationImportSelector
扫描AutoConfiguration
扫描AutoConfiguration
扫描classpath下所有的jar包
在META-INF/spring.factories配置好的AutoConfiguration
扫描出来需要执行的AutoConfguration
AutoConfigurationImportSelector类中重写了ImportSelector中selectImports方法,批量返回需要装配的配置类
通过Spring提供的SpringFactoriesLoader机制,扫描classpath下的META-INF/spring.factories文件,读取需要自动装配的配置类
依据条件筛选的方式,把不符合的配置类移除掉,最终完成自动装配
启动流程图
1 java命令,调用main方法
2 创建spring 容器
创建了一个spring容器,这个容器直接进行refresh,就是对内部的DefaultListableBeanFactory进行各种初始化和准备工作,但是这些工作看起来完全是无关紧要的,接着还调用了这个容器的bean实例化和依赖注入的入口,此时会初始化20多个无关键要的bean,基本对系统的核心逻辑构成不了什么关键的东西
第一个无关紧要的spring容器初始化完毕之后,走监听回调机制的时候,触发正式的spring容器的初始化的工作,以及后续的一系列正式的系统启动和组装的工作
3 正式的spring容器要进行prepareContext,准备工作
此时会进行一些三方框架/自己框架的bean后处理器的注册,内部也是有DefaultListableBeanFactory,直接基于注解扫描器,扫描自定义的注解获取自定义的bean定义,放到spring容器里去
4 对spring容器执行refresh操作
PS:spring容器已经是有了AnnotationConfigApplicationContex,
会针对DefaultListableBeanFactory进行一系列的初始化和准备的工作【注册了核心的一些bean后处理器】
AutowiredAnnotationBeanPostProcessor,就是在这里注册进去的,还有一些其他的bean后处理器也是在这里被加入的,假设后续我们自己研发一些框架,你想要让自己的框架可以在spring容器初始化所有bean的时候,可以对指定注解的bean来进行处理
5 在spring容器onRefresh的工程
创建内嵌的tomcat的准备
6 必然会触发三方框架的自动装配【bean定义】
普通的方式定义
spring mvc、dubbo、mybatis等各种三方框架的AutoConfiguration自动装配都会去执行,都会纷纷把各自的bean定义(包括mapper+动态代理实现类的bean),都会塞到spring容器里去
特殊的方式定义
spring mvc的DispatcherServlet(直接注册给tomcat,可以感知spring容器)、mybatis的SqlSessionFactory这种核心bean,会被三方框架的自动装配直接实例化,把bean注册到spring容器里去
7 spring容器正式开始工作,实例化所有bean以及完成依赖注入
finishBeanFactoryInitialization里面,就会去触发BeanFactory.preInstantiateSingletons,spring容器正式工作
8 系统组装完毕,spring boot启动成功
0 条评论
下一页