当前位置:首页 > Java技术 > springmvc源码分析——入门看springmvc的加载过程

springmvc源码分析——入门看springmvc的加载过程

2022年09月16日 17:02:40Java技术10

本文将分析springmvc是如何在容器启动的时候将各个模块加载完成容器的创建的。

我知道在web.xml文件中我们是这样配置springmvc的:

springmvc源码分析——入门看springmvc的加载过程 _ JavaClub全栈架构师技术笔记

可以看到,springmvc的核心控制器就是DispatcherServlet。看下DispatcherServlet的继承关系:

springmvc源码分析——入门看springmvc的加载过程 _ JavaClub全栈架构师技术笔记

HttpSerlvetBean继承自HttpServlet。

HttpServletBean覆写了init方法,对初始化过程做了一些处理。这个方法是final的,也就是这个方法是不能被继承的,因此我们就可以断定spring在做这里的时候,也就是初始化的时候的入口就是init方法,这个入口是不能被子类去实现的。init方法中执行了如下的操作:

springmvc源码分析——入门看springmvc的加载过程 _ JavaClub全栈架构师技术笔记

这里我们重点关注一下用黑线标注的initServletBean(),try语句块中的代码是做一些跟springmvc配置文件,以及资源文件相关的初始化工作,我们不做深入的研究,只需要知道相关的在web.xml文件中的配置相关的信息是在这里处理的,我们重点关注一下springmvc整体的初始化流程,让大家了解spring是如何加载的。好了我们看initServletBean()这个方法:

springmvc源码分析——入门看springmvc的加载过程 _ JavaClub全栈架构师技术笔记

这时候我们发现在httpServletBean的这个类中有这个方法,但是没有实现,而且是一个protocted修饰的方法,这也就是说这个需要子类去实现,好了我们顺着人家的代码进入freamWorkServlet中:

springmvc源码分析——入门看springmvc的加载过程 _ JavaClub全栈架构师技术笔记

 此时的initServletBean()方法又是一个final修饰的方法,跟httpservletBean中的init()方法是一样的,效果作用也一样我们就不再赘述。这里我们进入该方法的具体实现。我们发现这个时候在整个的方法中最关键的就是initWebApplicationContext()这个方法,我们大家对applicationContext应该是比较熟悉的,因为spring的容器其实就是一个context。这时候才是真正的开始容器的初始化。好了我们进入initWebApplicationContext()这个方法:

springmvc源码分析——入门看springmvc的加载过程 _ JavaClub全栈架构师技术笔记

在这个方法中代码的前两行,我们仍可以理解,因为springmvc的基于spring的,所以第一步是首先要去获取parent父容器也就是spring的容器。然后开始根据父容器开始创建springmvc的容器。这里我们再进入下一步之前,我觉着有必要对createWebApplicationContext(parent)这块做一个简答的解释:

springmvc源码分析——入门看springmvc的加载过程 _ JavaClub全栈架构师技术笔记

其实整个这个处理的效果或者用途就是用来将当前的springmvc的容器与他的父容器进行一个关联,比如:

wac.setParent(parent);
wac.setServletContext(getServletContext());
wac.setServletConfig(getServletConfig());
wac.setNamespace(getNamespace());

最后将wac这个容器进行一个刷新。

接下来我们返回上一步,说到的对springmvc的容器和他的父容器进行一个关联之后进行下一步的操作。 onRefresh(wac);springmvc源码分析——入门看springmvc的加载过程 _ JavaClub全栈架构师技术笔记

在frameServlet中的initWebApplicationContext方法中的第三行代码就是这句,但是我们在frameWorkServlet中看到springmvc源码分析——入门看springmvc的加载过程 _ JavaClub全栈架构师技术笔记

同样是一个没有实现的方法,我们就应该可以推断的出来这个方法的具体实现应该交给他的子类去处理,这时候我们就要进入到他的子类dispatcherServlet中看到的是如下的实现:

springmvc源码分析——入门看springmvc的加载过程 _ JavaClub全栈架构师技术笔记

    到这里我相信大家应该比较看着顺眼一些,这里才是我们再日常的开发中接触比较多的一些词或者类。我们看到在dispaerServlet中的onRefresh()方法中只有一个简单的initStrategies()方法,看到这个词Strategies,这是策略的意思,到这里了跟大家说一下,springmvc中使用到的设计模式----策略模式。好了进入initStrategies()方法后,如上图,这个时候springmvc就开始去加载对应的一些模块中主要的组件,比如initMultipartResolver用来springmvc处理文件的上传,initLocaleResolver(context)用来处理国际话语言相关的一些操作,initThemeResolver()这个是用来处理一些有关动态更换样式的支持(主题),initHandlerMappings()这个很重要处理我们经常听到的有关url和controller的映射关系,initHandlerAdapters()处理映射有关的适配相关,initHandlerExceptionResolvers(context)用于springmvc有关异常的处理,initRequestToViewNameTranslator(context)处理请求到视图名称的一个转换,initViewResolvers()处理视图。针对这几个策略今天就不细讲。下次我们重点讲各个策略在springmvc的初始化过程中是如何工作的。

    对springmvc的整个的加载过程做一个简答的总结,在整个加载过程中httpServletBean是我们的入口,负责处理一些有关配置文件或者资源的准备,这是因为我们很多的bean有可能依赖这些资源,然后调用initServletBean()方法开始servlet容器的创建工作,这时候httpServletBean只是创建工作的入口,具体的创建是在他的子类frameWorkServlet中来做的,在frameWorkServlet中负责去跟父容器进行关联,并创建createWebApplicationContext。然后进入onRefresh()方法也就是他的子类dispaerServlet中取按照策略模式的方式对springmvc中的具体的每个模块进行初始化。所以整个过程我们发现springmvc在做初始化的时候每个类所做的工作是不一样的,也是有分工的。httpservletBean主要是创建一些配置或资源文件,frameWorkServlet主要是创建容器以及跟父容器的关联。而在dispactorerServlet这个子类中才是真正的去做一些具体的初始化工作。

总结一下各个Servlet的作用:

1. HttpServletBean

 主要做一些初始化的工作,将web.xml中配置的参数设置到Servlet中。比如servlet标签的子标签init-param标签中配置的参数。

2. FrameworkServlet

 将Servlet与Spring容器上下文关联。其实也就是初始化FrameworkServlet的属性webApplicationContext,这个属性代表SpringMVC上下文,它有个父类上下文,既web.xml中配置的ContextLoaderListener监听器初始化的容器上下文。

3. DispatcherServlet 

 初始化各个功能的实现类。比如异常处理、视图处理、请求映射处理等。

作者:平凡希
来源链接:https://www.cnblogs.com/xiaoxi/p/8780147.html

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/42037.html

标签: SpringMVC
分享给朋友:

“springmvc源码分析——入门看springmvc的加载过程” 的相关文章

SpringMVC中参数的传递(一)

SpringMVC中参数的传递(一)

前言 1.首先,我们在web.xml里面配置前端控制器DispatcherServlet以及字符编码过滤器(防止中文乱码),配置如下: 1 <?xml version="1.0" encoding="UTF-8"?> 2...

SpringMVC常见问题

SpringMVC常见问题

文章目录 404错误 请求的url不存在 500错误 请求的url未绑...

SpringMVC使用@ResponseBody日期返回时间戳的问题

SpringMVC使用@ResponseBody日期返回时间戳的问题

使用springMVC的@ResponseBody注解返回日期时,返回给前台页面显示的是一个时间戳, 解决方法就是自己写一个工具类,继承JsonSerializer泛型类型为日期Date 在对应POJO类日期字段的get方法上 加上如下图所示的...

SpringMVC文件下载

基于此篇文章中的一些没有注释的相关问题,今天进行SpringMVC的文件下载的更新: 新方法: 1.控制层,新建一个方法,返回值类型为ResponseEntity<byte[]>的方法,并在其函数的后面添加对应的后台需要处理的参数,比如可以传递FIleName...

SpringMVC基本原理详解

SpringMVC基本原理详解

MVC是什么、SpringMVC是什么、能帮我们做什么? 带着问题去学习: SpringMVC是帮助我们开发Web项目的,下面讲简单分析, 我们为要用到SpringMVC?以及 MVC是什么?SpringMVC是什么?能帮我们做什么?...

SpringMVC常见面试题总结(超详细回答)

SpringMVC常见面试题总结(超详细回答)

1、什么是Spring MVC ?简单介绍下你对springMVC的理解? Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,Controller分离,将web层进行职责解耦,把复杂的web应...

【SpringMVC学习06】SpringMVC中的数据校验

【SpringMVC学习06】SpringMVC中的数据校验

 这一篇博文主要总结一下springmvc中对数据的校验。在实际中,通常使用较多是前端的校验,比如页面中js校验,对于安全要求较高的建议在服务端也要进行校验。服务端校验可以是在控制层conroller,也可以是在业务层service,controller校验页面请求的参数的合法性,在服...

Spring——Spring MVC(一)

Spring——Spring MVC(一)

本文主要依据《Spring实战》第五章内容进行总结 Spring MVC框架是基于模型-视图-控制器(Model-View-Controller,MVC)模式实现,它能够构建像Spring框架那样灵活和松耦合的Web应用。...

springmvc 修改默认配置文件名 springmvc-servlet.xml 改为xxx.xml

springmvc 修改默认配置文件名 springmvc-servlet.xml 改为xxx.xml

关于springmvc框架的配置,springmvc 框架一般会根据你在web.xml中servlet-name 的名字加-servlet.xml 为默认配置文件,你每次部署项目启动服务器时,在编译项目的过程中就会自动去查找配置文件。当然如果你想更改配置文件的名字的话,你可以添加...

学习SpringMVC——说说视图解析器

学习SpringMVC——说说视图解析器

相信大家在昨天那篇如何获取请求参数篇中都已经领略到了spring mvc注解的魅力和套路了。今天主要就来说说在达到目的地的路上,我们都经历了些什么!搭上@RequestMapping的便车,借助@RequestParam、@PathVariable获取请求参数,最终还能够通过神奇的“r...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。