springboot项目启动的源码分析,springboot项目run方法底层原理(超详细,必会)

本文深入探讨了SpringBoot项目的启动过程,从run方法的执行开始,详细阐述了SpringApplication的初始化,包括资源加载、主源类设置、监听器和初始化器的配置。接着,分析了SpringBoot如何识别启动类并准备环境,包括加载配置、打印横幅及创建上下文对象。最后,重点讨论了刷新上下文的步骤,即IOC容器的初始化。整个过程揭示了SpringBoot启动的本质和核心机制。
摘要由CSDN通过智能技术生成

后面还有springboot的自动装配的过程,上链接:https://blog.csdn.net/wang121213145/article/details/123879652


springboot项目启动的本质,springboot项目run方法底层原理

今天刚做完核酸闲的无聊还是拔一下源码解解乏
在这里插入图片描述

springboot启动首先执行的就是run方法,直接上源码:在这里插入图片描述
——>run——>run
在这里插入图片描述

初始化SpringApplication

发现这里初始化了一个SpringApplication,点进去看一下嘛咱们:

在这里插入图片描述

 public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
			// 1、资源初始化资源加载器为 null
		    this.resourceLoader = resourceLoader;
		
		    // 2、断言主要加载资源类不能为 null,否则报错
		    Assert.notNull(primarySources, "PrimarySources must not be null");
		
		    // 3、初始化主要加载资源类集合并去重
		    this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
		
		    // 4、推断当前 WEB 应用类型
		    this.webApplicationType = deduceWebApplicationType();
		
		    // 5、设置应用上线文初始化器
		    setInitializers((Collection) getSpringFactoriesInstances( ApplicationContextInitializer.class));      
		
		    // 6、设置监听器
		    setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
		
		    // 7、推断主入口应用类
		    this.mainApplicationClass = deduceMainApplicationClass();
	}

重点看下下面两个方法:

this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class));
this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));

可以看出来大概意思就是初始化和监听,这两个方法还是挺重要的,涉及到spring.factories文件的加载
进入getSpringFactoriesInstances方法看下:
在这里插入图片描述
在这里面获取到一个类加载器,下面有一个loadFactoryNames方法
在这里插入图片描述

熟悉嘛,这个方法在研究springboot自动装配原理的时候@SpringbootApplication注解的时候里面有提及,我们再来看下这个方法
在这里插入图片描述
在这里插入图片描述

加载spring-boot-autoconfigure-2.0.3.RELEASE.jar!/META-INF/spring.factories这个配置文件,并且由 cache.put(classLoader, result);看出来是添加到缓存中的,方便下次的读取,就不需要再去读取配置文件了。

之后继续往下看this.deduceMainApplicationClass();

在这里插入图片描述
通过异常函数来找到main函数,然后找到对应的启动类并返回,这就是整个初始化的过程。嘶~

在这里插入图片描述

接下来就是run方法

Run方法深究

在这里插入图片描述
run方法里面才是重中之重,不要着急,下面一行一行来分析:

!!!!!!!!一行一行:


start()方法

在这里插入图片描述
start()方法就是一个时间统计的问题,记录下我们运行的时间。不用深究


往下走:

在这里插入图片描述
这是一个获取监听器的操作并进行监听,哎?忽然想到刚才初始化的时候不就有一个监听器,
在这里插入图片描述

正解。就是获取初始化的监听器
这也是一个观察者模式,不懂得可以下去看下。


接续走: >DefaultApplicationArguments(args);

封装参数,不多说,接着走~


prepareEnvironment

在这里插入图片描述

在springboot应用程序里面中有一个很重要的接口对象Environment
Environment——>实现类StandardEnvironment
在这里插入图片描述
在这里插入图片描述

这里加载当前系统的变量以及当前系统的一些属性值,像是系统变量系统名字以及编码格式等等好多东西
在这里插入图片描述


接着走~

在这里插入图片描述
printBanner这个就是控制台打印的横幅,就是这个↓

在这里插入图片描述
这个总明白吧


走~
在这里插入图片描述
创建上下文对象,往下异常赋值
简化:
在这里插入图片描述


重点方法来了

this.prepareContext(context, environment, listeners, applicationArguments, printedBanner);

快进去进去直接列出来:
在这里插入图片描述
load()——>load()往下
在这里插入图片描述
this.isComponent(source)为判断加载类上面的注解是否是Component注解

然后接着

this.annotatedReader.register(new Class[]{source});

将启动类放进来,这里并不会完成注解的解析,只是把启动类做了一个基本的标识,方便后面调用。

然后返回返回返回

总的来说就是:识别到启动类,方便后面启动类的注解解析


走~

refreshContext

在这里插入图片描述

refreshContext熟悉了吧,IOC的底层,总来说就是通过IOC创建Bean对象,初始化操作。也可以理解为IOC的初始化。不懂得可以看看IOC底层哦~

这是springboot项目启动的本质,后面自动装配的原理看我的另一篇文章哦~
https://blog.csdn.net/wang121213145/article/details/123879652?spm=1001.2014.3001.5501

请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杵意

谢谢金主打赏呀!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值