百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

SpringMVC源码解析(4):DispatcherServlet上下文初始化

yuyutoo 2024-10-26 16:08 6 浏览 0 评论

前文介绍了DispatcherServlet的初始化方法init(),其中初始化上下文的主要逻辑实现都委托给了FrameworkServlet的initWebApplicationContext() 方法。本文就来重点介绍一下这个方法。

initWebApplicationContext() 函数的主要工作就是创建或刷新 WebApplicationContext(WAC) 实例,并对所使用的变量进行初始化。

DispatcherServlet(FrameworkServlet)进行上下文初始化的流程如下:

(1)寻找WAC实例

首先通过this.webApplicationContext 来判断是否已经通过DispatcherServlet的构造函数完成了上下文初始化。如果不等于null,说明已经通过构造函数完成了初始化。

如果上下文实例没有在构造时注入,接下来就通过函数 findWebApplicationContext() 看看是否在ServletContext已经注册了。

(2)创建WAC实例

如果上面两个地方都不行,那么就要通过createWebApplicationContext()来创建上下文实例。

(3)WAC实例的配置及刷新

无论构造函数注入,还是单独创建WAC实例,最后都要调用 configureAndRefreshWebApplicationContext() 方法对WAC实例进行配置及刷新。

与ContextLoaderListener上下文的异同

前文曾介绍过ContextLoaderListener初始化上下文的过程。我们发现DispatcherServlet初始化上下文的过程,与ContextLoaderListener初始化上下文的过程非常类似,最后也都是通过ServletContext的setAttribute方法放到ServletContext中的。

从web.xml的配置可知ContextLoaderListener会先于DispatcherServlet创建 ApplicationContext。DispatcherServlet在创建 ApplicationContext 时会先找到由 ContextLoaderListener 所创建的ApplicationContext,再将后者作为参数传给DispatcherServlet的ApplicationContextsetParent()方法,作为它的父上下文。

ContextLoaderListener中创建 ApplicationContext 主要用于整个Web应用程序需要共享的一些组件,比如DAO,数据库的ConnectionFactory等。而由DispatcherServlet创建的ApplicationContext主要用于和该Servlet相关的一些组件,比如Controller、ViewResovler等。

onRefresh()

FrameWorkServlet类还提供了onRefresh()方法,这个方法在上下文刷新后会调用。DispatcherServlet重写了该方法。这个方法主要用于刷新Spring在Web功能实现中所必须使用的全局变量。

@Override
	protected void onRefresh(ApplicationContext context) {
		initStrategies(context);
}

onRefresh()只调用了一个方法initStrategies(),这个方法主要是初始化各种策略对象。关于策略对象,我们在之后的文章中再做介绍。

我会持续更新关于物联网、云原生以及数字科技方面的文章,用简单的语言描述复杂的技术,也会偶尔发表一下对IT产业的看法,欢迎大家关注、转发和评论,谢谢。

相关推荐

Linux内核网络设备驱动

1.接收数据包过程概述介绍数据包收包过程,有助于我们了解Linux内核网络设备在数据收包过程中的位置,下面从宏观的角度介绍数据包从被网卡接收到进入socket接收队列的整个过程:加载网卡驱动,初...

「技术」一文带你掌握Linux字符设备架构

一、Linux设备分类Linux系统为了管理方便,将设备分成三种基本类型:...

「技术干货」一文搞懂Linux内核调试方法(二)

上篇回顾:一文Linux内核调试方法(一)...

Pytorch学习Day 5: 神经网络基础(nn.Module)学习课程

学习目标理解PyTorch中nn.Module类的作用和核心功能。掌握如何使用nn.Linear构建简单的单层神经网络。学会访问和打印神经网络的参数。通过代码实践加深对PyTorch神...

内存问题探微

这篇文章是我在公司TechDay上分享的内容的文字实录版,本来不想写这么一篇冗长的文章,因为有不少的同学问是否能写一篇相关的文字版,本来没有的也就有了。说起来这是我第二次在TechDay上做的...

阿里架构师的5年经验总结:盘点数据仓库常用的4大数据工具平台

数据仓库是解决方案,真正落地的时候,还要依托于工具平台。...

软考系统架构师2021_备考说明---软考高级之系统架构师_备考笔记

第一轮一个半月.这些是考试内容.这个通过率全国,只有百分之10左右..挺难的....

从 Java 程序员到架构师:技术进阶与能力跃迁的完整路径(深度版)

#程序员如何进阶为架构师?#从Java程序员到架构师:技术进阶与能力跃迁的完整路径(深度版)...

大厂架构师被A1逼疯:我20年经验不如A1五分钟生成的方案

程序员末日?AI竟包办八成代码!前端真的凉了?...

立志成为架构师的你请收下——架构设计的三种思维

软件架构的几个误区1.架构的目标即灵活性灵活性越好的架构越能适应未来变化的需要,但不是架构设计的目标,一味追求容易陷入另外一个坑,造成性能的损失和资源的浪费。2.一套成熟的开源框架就是架构框...

系统架构师之——软件开发方法

不管你是开发人员,还是互联网行业人员,基本上经常看到各种各样的软件相关的图,如什么架构图什么设计图什么模式图甘特图等。很多时候总是傻傻分不清。对此,我们很有必要对系统开发基础知识有认知。对于一名程序员...

系统分析师和系统架构师的区别是什么?

软考高级包括系统分析师、信息系统项目管理师、网络规划设计师、系统架构设计师和系统规划与管理师,其中,系统分析师和系统架构师这两个科目是大家很容易搞混淆的,因为都属于软考,所以他们的报考时间、报考条件都...

软件开发 “四高”的详细分析——高扩展

高并发架构的黄金法则:用“分治异步”玩转每秒10万+请求弹性架构:像搭乐高一样扩展你的系统杰夫·贝索斯曾说:“架构不是设计出来的,而是演化出来的。”高并发系统的核心在于...

复习七天通过软考高级系统架构师

前言软考复习的方式可以分为两种:报班和自学。首先晒一下成绩,开心的一批,虽然考的不是很好!!每科满分75,需要同时都>=45分才算合格。...

软件开发 “四高”的详细分析,即高并发、高性能、高扩展、高可用

高并发(HighConcurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求。高并发相关常用的一些指标有响应时间(ResponseT...

取消回复欢迎 发表评论: