springboot启动分析

author author     2023-02-16     677

关键词:

参考技术A SpringApplication.run方法中,实例化一个SpringApplication对象,并调用该对象的run方法。

在SpringApplication构造函数中,主要完成了这样两件事:

在run()中主要完成如下几项工作:

在refreshContext方法中实现Ioc容器的初始化和Ioc的依赖注入。其中,在invokeBeanFactoryPostProcessors()方法中完成了IoC容器初始化过程的三个步骤。
  第一步:Resource定位
  在SpringBoot中,我们都知道他的包扫描是从主类所在的包开始扫描的,prepareContext()方法中,会先将主类解析成BeanDefinition,然后在refresh()方法的invokeBeanFactoryPostProcessors()方法中解析主类的BeanDefinition获取basePackage的路径。这样就完成了定位的过程。其次SpringBoot的各种starter是通过SPI扩展机制实现的自动装配,SpringBoot的自动装配同样也是在invokeBeanFactoryPostProcessors()方法中实现的。还有一种情况,在SpringBoot中有很多的@EnableXXX注解,细心点进去看的应该就知道其底层是@Import注解,在invokeBeanFactoryPostProcessors()方法中也实现了对该注解指定的配置类的定位加载。
  常规的在SpringBoot中有三种实现定位,第一个是主类所在包的,第二个是SPI扩展机制实现的自动装配(比如各种starter),第三种就是@Import注解指定的类。
  第二步:BeanDefinition的载入
  在第一步中说了三种Resource的定位情况,定位后紧接着就是BeanDefinition的分别载入。所谓的载入就是通过上面的定位得到的basePackage,SpringBoot会将该路径拼接成:classpath :org/springframework/boot/demo/ / .class这样的形式,然后一个叫做PathMatchingResourcePatternResolver的类会将该路径下所有的.class文件都加载进来,然后遍历判断是不是有@Component注解,如果有的话,就是我们要装载的BeanDefinition。大致过程就是这样的了。
TIPS:@Configuration,@Controller,@Service等注解底层都是@Component注解,只不过包装了一层罢了。
  第三步:注册BeanDefinition
  这个过程通过调用上文提到的BeanDefinitionRegister接口的实现来完成。这个注册过程把载入过程中解析得到的BeanDefinition向IoC容器进行注册。通过上文的分析,我们可以看到,在IoC容器中将BeanDefinition注入到一个ConcurrentHashMap中,IoC容器就是通过这个HashMap来持有这些BeanDefinition数据的。比如DefaultListableBeanFactory 中的beanDefinitionMap属性。
  invokeBeanFactoryPostProcessors方法中主要通过ConfigurationClassPostProcessor完成IoC容器初始化的过程。
  registerBeanPostProcessors方法中注册了AutowiredAnnotationBeanPostProcessor,registerBeanPostProcessors方法中对bean进行初始化时会调用AutowiredAnnotationBeanPostProcessor的接口实现@Autowired,完成Ioc的注入。

参考:
https://www.cnblogs.com/hello-shf/p/10992377.html
https://www.jianshu.com/p/b86a7c8b3442

springboot启动分析

通常我们都是在main方法中调用SpringApplication.run()方法启动SpringBoot应用的,今天来看一下启动过程中都干了些什么。上图。650)this.width=650;"src="https://s5.51cto.com/wyfs02/M00/08/01/wKiom1nZgFzidkJ9AADZ1ECFUm0224.png"style="float:none;"title 查看详情

深入springboot原理——一步步分析springboot启动机制(starter机制)

前言使用过springboot的同学应该已经知道,springboot通过默认配置了很多框架的使用方式帮我们大大简化了项目初始搭建以及开发过程。本文的目的就是一步步分析springboot的启动过程,分析springboot是如何帮我们简化这个过程的。sp... 查看详情

深入springboot原理——一步步分析springboot启动机制(starter机制)

一:前言使用过springboot的同学应该已经知道,springboot通过默认配置了很多框架的使用方式帮我们大大简化了项目初始搭建以及开发过程。本文的目的就是一步步分析springboot的启动过程,分析springboot是如何帮我们简化这个过程... 查看详情

[springboot]1.springboot启动过程源码分析

关于SpringBoot,已经有很多介绍其如何使用的文章了,本文从源代码(基于Spring-boot1.5.6)的角度来看看SpringBoot的启动过程到底是怎么样的,为何以往纷繁复杂的配置到如今可以这么简便。1.入口类packagecom.example.demo;importor... 查看详情

[springboot]1.springboot启动过程源码分析

关于SpringBoot,已经有很多介绍其如何使用的文章了,本文从源代码(基于Spring-boot1.5.6)的角度来看看SpringBoot的启动过程到底是怎么样的,为何以往纷繁复杂的配置到如今可以这么简便。1.入口类packagecom.example.demo;importor... 查看详情

springboot应用启动过程分析

真的好奇害死猫!之前写过几个SpringBoot应用,但是一直没搞明白应用到底是怎么启动的,心里一直有点膈应。好吧,趁有空去看了下源码,写下这篇博客作为学习记录吧!个人拙见,若哪里有理解不对的地方,请各路大神指正... 查看详情

#springboot常用扩展点介绍容器启动源码分析

SpringBoot常用扩展点介绍、容器启动源码分析SpringApplication.run()实例化一个SpringApplication创建一个SpringApplication实例publicstaticConfigurableApplicationContextrun(Class<?>[]primarySources,String[]args)returnnewSpringA 查看详情

springboot的启动流程分析(代码片段)

通过分析我们可以找到 org.springframework.boot.SpringApplication 中如下,publicstaticConfigurableApplicationContextrun(Object[]sources,String[]args)returnnewSpringApplication(sources).run(args);可以看出,Spri 查看详情

springboot启动故障分析神器

大家好,我是指北君。相信大家在启动SpringBoot项目的时候,也遇到过由于各种各样的原因而启动失败的情况吧,显示出一大堆的错误信息,比如端口占用时会打印如下异常:***************************APPLICATION FAILED... 查看详情

5w字springboot源码分析(代码片段)

SpringBoot源码分析文章目录SpringBoot源码分析启动类分析@SpringBootConfiguration@EnableAutoConfiguration@ComponentScanSpringBoot启动流程1.准备SpringApplication获取当前web应用类型设置初始化器设置监听器推导主应用程序类2.SpringBoot的运行创... 查看详情

springboot:springboot启动原理分析(代码片段)

文章目录SpringBoot启动原理分析一、依赖导入原理二、SpringBoot包扫描原理 三、SpringBoot自动配置原理SpringBoot启动原理分析一、依赖导入原理父项目版本控制ctrl+点击spring-boot-starter-parent进入继续点击,进入spring-boot-dependencie... 查看详情

springboot:springboot启动原理分析(代码片段)

文章目录SpringBoot启动原理分析一、依赖导入原理二、SpringBoot包扫描原理 三、SpringBoot自动配置原理SpringBoot启动原理分析一、依赖导入原理父项目版本控制ctrl+点击spring-boot-starter-parent进入继续点击,进入spring-boot-dependencie... 查看详情

5w字springboot源码分析(代码片段)

SpringBoot源码分析文章目录SpringBoot源码分析启动类分析@SpringBootConfiguration@EnableAutoConfiguration@ComponentScanSpringBoot启动流程1.准备SpringApplication获取当前web应用类型设置初始化器设置监听器推导主应用程序类2.SpringBoot的运行创... 查看详情

涨姿势:springboot2.x启动全过程源码分析

目录SpringApplication实例run方法运行过程总结上篇《SpringBoot2.x启动全过程源码分析(一)入口类剖析》我们分析了SpringBoot入口类SpringApplication的源码,并知道了其构造原理,这篇我们继续往下面分析其核心run方法。SpringApplication实... 查看详情

源码分析springboot启动(代码片段)

...在其实现类中把值读出来再set进去。于是乎就想探究一下SpringBoot启动中都干了什么。引子就像引用中说的,用到了ApplicationRunner类给静态class赋yml中的值。代码先量一下,是这样:@Data@Component@EnableConfigurationPr 查看详情

springboot高级原理分析--springboot启动流程分析(代码片段)

1.SpringBoot启动流程分析下面是SpringBoot完整的启动流程说明:本节案例承接SpringBoot高级原理分析–监听机制,我们通过Debug的方式去查看启动的流程:1.1流程分析:初始化1.1.1在程序的入口处打一个断点说明:... 查看详情

springboot应用启动内置tomcat的过程分析(代码片段)

Connector启动过程Connector是Tomcat提供的类。//通过此Connector开始处理请求@OverrideprotectedvoidstartInternal()throwsLifecycleException//Validatesettingsbeforestartingif(getPortWithOffset()<0)thrownewLifecycleEx 查看详情

springboot配置外部tomcat项目启动流程源码分析(下)(代码片段)

前言SpringBoot应用默认以Jar包方式并且使用内置Servlet容器(默认Tomcat),该种方式虽然简单但是默认不支持JSP并且优化容器比较复杂。故而我们可以使用习惯的外置Tomcat方式并将项目打War包。一键获取SpringBoot笔记【6】SpringApplica... 查看详情