Spring-原理篇-DispatcherServlet 初始化 怎么和IOC进行了打通?

news2025/1/11 10:05:52

委托模式的体现,在初始化醒目的时候Spring MVC为我们提供了一个DispatcherServlet,映射了所有的路径,所有的请求都会先到达这里然后被转发到具体的Controller 进行处理,此文来探索一下,DispatcherServlet 初始化的时候是怎么和Spring IOC打通的。

DispatcherServlet初始化

初始化只在首次加载的时候进行初始化,也就是说我们的DispatcherServlet是单例的。
HttpServletBean#init()
在这里插入图片描述
在这里插入图片描述
可以看到创建了一个WebApplicationContext,在里面调用了onRefresh方法,那我们看看onRefresh做了什么事情呢?
在这里插入图片描述
我们继续跟进去发现,初始化其实就是IOC容器去获得这个Bean对象,这个时候我产生了一个疑问,这个启动流程是什么时候和IOC容器打通的呢?并且断点到这里的时候Context 是AnnotationConfigServletWebServerApplicationContext,哪里来的,怎么就能获取Bean呢?
在这里插入图片描述
啊啊啊,真是反复调试了好久终于算是理清楚了整个流程,首先我们来看SpringApplication#run方法:
在这里插入图片描述
看到了吧,这里创建Context的时候可大有文章,继续点进去看:
在这里插入图片描述
看到了没有,这里有个ApplicationType,那么这个值又是哪里来的?有那些值?

在这里插入图片描述
好家伙是推断出来的,推断就是根据类名来判断的,那有哪些值呢?嘿嘿看到了吧,有三种值。
在这里插入图片描述
好吧,我知道了这一步是判断成了Servlet类型创建了这个类型的AnnotationConfigServletWebServerApplicationContext,那然后呢?别急让我们继续跟踪一波源码呀,我们直接看下面刷新方法:
在这里插入图片描述
在这里插入图片描述
哇偶最终是调用的Context的刷新方法呢,那我们继续看看呗,我尼玛好家伙这又父类去了:
在这里插入图片描述
那么父类是谁?尽然是AbstractApplicationContext 索达斯内,好家伙熟悉了吧,想必跟踪过Spring源码的同学可太熟悉这个类了,原来如此呀,这不就和Spring IOC打通了嘛。
在这里插入图片描述

我们继续看,刷新之后干了什么?看到了吧创建了WebServer。
在这里插入图片描述
好,没完呢, 到这只是回答了为什么和IOC容器打通了,那么为什么FrameFrameWrork#initWebApplicationContext这方法里面红框里的代码执行了以后就拿到了刚刚创创建的AnnotationConfigServletWebServerApplicationContext呢?
在这里插入图片描述
好我们继续看源码,关键就在这里了是通过ServletContext#getAttribute得到的,且attrName = org.springframework.web.context.WebApplicationContext.ROOT,那么是什么时候设置进去的,那既然有get,那有没有set方法呢?于是找到了setAttribute这个方法:
在这里插入图片描述
那我们找到这个方法在哪里用了?用到的地方太多了,那么直接在接口上打一个断点,并且当属性是org.springframework.web.context.WebApplicationContext.ROOT不就可以找到谁调用了这个方法嘛,机智如我呀。
在这里插入图片描述
哈哈哈哈,终于被我发现了,好家伙,看堆栈是通过prepareWebApplicationContext这个调用过来的:

在这里插入图片描述
ServletWebServerApplicationContext#prepareWebApplicationContext在这里插入图片描述

但是这个方法又是被谁调用了呢?那么我们继续追呗。
在这里插入图片描述
芜湖,getSelfInitializer是在创建Web容器的时候调用的,到这里逻辑闭环了不是,这不就是创建WebServer的时候调用的吗?
在这里插入图片描述
哈哈哈哈,小样拿下。跟踪源码经常晕头转向但是,梳理清楚流程以后还是蛮开心的。好了今天的文章到此结束,能力不足水平有限欢迎批评指正,比心么么。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1959850.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

强化学习学习(四)Model-Based Reinforcement Learning 从原理到改进分析

文章目录 Model-Based RLBasics of Model-based reinforcement learningUncertainty of Model-based RLUse uncertainty in Model-based RLState space (latent space) models Model-Based RL Basics of Model-based reinforcement learning Model-based reinforcement learn…

当视频遇上AI:SAM 2 打破想象的界限!

当视频遇上AI:SAM 2 打破想象的界限! Segment Anything Model 2 Meta公司推出 Llama 3.1 没多久,又在今天推出了Segment Anything Model 2(SAM 2),以其强大的实时、可提示对象分割能力,引领了视…

【网络安全】破解邀请码实现未经授权的访问和账户接管

未经许可,不得转载。 文章目录 前言1、邀请用户2、低级账户访问3、提取用户 ID 和 OTP4、准备字典5、攻击6、账户接管 前言 ExampleSpark(化名)是一个专为团队管理和项目协作而设计的强大平台。它提供了用于管理用户、项目和权限的综合工具。…

Hutool——发送http请求案例

文章目录 前言依赖环境Hutool 请求验证准备第三方接口编写接口调用上述定义接口 自测验证get 请求post 非常规 application/x-www-form-urlencodedpost 常规 application/json 前言 在实际开发过程中,微服务环境下往往采取openfeign实现服务与服务之间的请求调用。…

createObjectURL的部分使用讲解

URL.createObjcetURL的部分详解 文章目录 URL.createObjcetURL的部分详解1. 为什么要使用createObjectURL2. createObjectURL的基本用法3. 转换后的文件进行展示或下载展示下载 首先,想记录一下这点是因为之前关于pdf文件的下载和预览,后端返回工作流时的…

燃爆你的创作欲!3款剪辑小助手让你爱不释手

视频剪辑,既是门艺术,也是门手艺。现在,因为社交媒体和视频网站的流行,越来越多的人开始自己尝试做视频。不管你是想娱乐大家,还是教点东西,或者搞点商业宣传,一款好的剪辑软件都能帮你提高效率…

遇到“NavigableString“object has no attribute “text“的解决方法(全)

在 Python 的 Beautiful Soup 库中,NavigableString 对象用于表示解析树中的文本内容。 有时候在获取json格式,解析BeautifulSoup的时候,可能会遇到这个问题。 那可能是在 NavigableString 对象上调用 .text 属性,因此就会出现 …

21款美规奔驰GLS450更换中规高配主机系统,您带来更贴合国内使用习惯和更丰富功能的体验

简单一句中文的“您好,奔驰”,抑或是轻轻触碰屏幕,就能与同级最先进的智能人机交互系统来场深度沟通,实现你的各种需求 创造情感纽带,将车辆打造为您的专属座驾。功能扩展后的 MBUX 智能人机交互系统能满足您多方位的…

AutoMQ 开源可观测性方案:夜莺 Flashcat

01 引言 在现代企业中,随着数据处理需求的不断增长,AutoMQ [1] 作为一种高效、低成本的流处理系统,逐渐成为企业实时数据处理的关键组件。然而,随着集群规模的扩大和业务复杂性的增加,确保 AutoMQ 集群的稳定性、高可…

Python学习-字符串

目录 ord() 与 chr() 力扣题目-转换成小写字母 count()函数 ord() 与 chr() ord() 和 chr() 用于字符和字符编码(通常是ASCII等)之间的转换。 1. ord() ord() 函数用于获取一个字符(通常是一个单字符字符串)的编码值。在ASC…

服务器怎么开启远程桌面连接权限?开启远程桌面连接权限的详细操作步骤

服务器怎么开启远程桌面连接权限? 服务器开启远程桌面连接权限的步骤通常依赖于服务器的操作系统。以下是基于Windows服务器和Linux服务器的详细操作步骤: Windows服务器 1.打开服务器管理器: -登录到Windows服务器。 -点击“开始”菜单&…

提升效率的五款神器

大家好,我是你们的小红书效率专家👩‍💻!今天要分享的是让你工作效率翻倍的五款软件利器,赶快拿出小本本记下来吧!🌟 1️⃣ 亿可达 - 软件连接器 作为一款自动化工具,亿可达被誉为…

内网基础——Windows认证

文章目录 一、本地认证二、网络认证2.1 NTLM协议2.1.1 Chalenge/Response2.1.2 总结2.1.3 Pass the Hash 2.2 Kerberos认证2.2.1 Kerberos认证协议的基础概念2.2.2 域认证粗略流程 三、Windows Access Token 一、本地认证 windows本地认证流程大致可以抽象为以下三个阶段&…

从源头解决砍单问题:Temu、亚马逊自养号采购防关联全攻略

近期有很多跨境卖家向珑哥咨询,他们在进行采购下单过程中会出现砍单的问题,其实造成这种的原因很多,一套稳定的测评系统并不是单解决IP的纯净度问题或者支付卡的卡头风控问题就可以解决的,Temu、亚马逊测评下单砍单率、F号率高的原…

是德KEYSIGHT B1500A 半导体测试仪

安捷伦Agilent/KEYSIGHT B1500A/b1506a/B1505A半导体测试仪 附加功能: 基于 PC 的仪器,配备 Microsoft Windows 操作系统和 EasyEXPERT 软件用于电流-电压 (IV)、电容-电压 (CV)、脉冲生成、快速 IV 和时域测量的单盒解决方案。十个模块插槽&#xff0…

爬虫学习——24.字体反爬

什么是字体反爬 网页开发者自己创造一种字体,因为在字体中每个文字都有其代号,那么以后在网页中不会直接显示这个文字的最终的效果,而是显示他的代号,因此即使获取到了网页中的文本内容,也只是获取到文字的代号&#…

还搞不清楚String、StringBuilder、StringBuffer?

目录 一、String——引用类型,而不是基本数据类型 二、StringBuffer类 三、StringBuilder类 四、String、StringBuffer、StringBuilder比较 五、String、StringBuffer、StringBuilder的选择 一、String——引用类型,而不是基本数据类型 1.…

怎么隐藏搜狗输入法

点击输入法,右键选择更多 点击选项,点击全屏隐藏

《“八股文”之辩:程序员面试与实际工作的纠葛》

在当今的编程世界中,“八股文”成为了一个备受争议的话题。它既是大中小企业面试程序员时的常见问题,又引发了广泛的讨论和思考。那么,“八股文”究竟在实际工作中扮演着怎样的角色呢? “八股文”作为面试的必问内容,…

福建聚鼎:现在装饰画好做吗

在当今社会,随着人们审美情趣的提升和生活品质的改善,家居装饰画已经成为了一种流行的墙面装饰方式。许多人都在思考,现在做装饰画是否是一个好时机? “逆水行舟,不进则退。”在日新月异的市场中,装饰画行业的竞争愈发…