springMvc 启动过程
转载自https://www.jianshu.com/p/dc64d02e49ac
这里给出一个简洁的文字描述版SpringMVC启动过程
:
tomcat web容器启动时会去读取web.xml
这样的部署描述文件
,相关组件启动顺序为: 解析<context-param>
=> 解析<listener>
=> 解析<filter>
=> 解析<servlet>
,具体初始化过程如下:
1、解析
<context-param>
里的键值对。2、创建一个
application
内置对象即ServletContext
,servlet上下文,用于全局共享。3、将
<context-param>
的键值对放入ServletContext
即application
中,Web应用
内全局共享。4、读取
<listener>
标签创建监听器,一般会使用ContextLoaderListener类
,如果使用了ContextLoaderListener类
,Spring
就会创建一个WebApplicationContext类
的对象,WebApplicationContext类
就是IoC容器
,ContextLoaderListener类
创建的IoC容器
是根IoC容器
为全局性的,并将其放置在appication
中,作为应用内全局共享,键名为WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE
- 5、
listener
创建完成后如果有<filter>
则会去创建filter
。 - 6、初始化创建
<servlet>
,一般使用DispatchServlet类
。 - 7、
DispatchServlet
的父类FrameworkServlet
会重写其父类的initServletBean
方法,并调用initWebApplicationContext()
以及onRefresh()
方法。 - 8、
initWebApplicationContext()
方法会创建一个当前servlet
的一个IoC子容器
,如果存在上述的全局WebApplicationContext
则将其设置为父容器
,如果不存在上述全局的则父容器
为null。 - 9、读取
<servlet>
标签的<init-param>
配置的xml文件
并加载相关Bean
。 - 10、
onRefresh()
方法创建Web应用
相关组件。
三、spring上下文容器配置后,初始化了什么?
既然,ServletContext是由Servlet容器初始化的,那spring的ContextLoaderListener又做了什么初始化呢?

四、spring配置时:<context:exclude-filter>的使用原因,为什么在applicationContext.xml中排除controller,而在spring-mvc.xml中incloud这个controller
谈谈springmvc的优化
上面我们已经对springmvc的工作原理和源码进行了分析,在这个过程发现了几个优化点:
1.controller如果能保持单例,尽量使用单例,这样可以减少创建对象和回收对象的开销.也就是说,如果controller的类变量和实例变量可以以方法形参声明的尽量以方法的形参声明,不要以类变量和实例变量声明,这样可以避免线程安全问题.
2.处理request的方法中的形参务必加上@RequestParam注解,这样可以避免springmvc使用asm框架读取class文件获取方法参数名的过程.即便springmvc对读取出的方法参数名进行了缓存,如果不要读取class文件当然是更加好.
3.阅读源码的过程中,发现springmvc并没有对处理url的方法进行缓存,也就是说每次都要根据请求url去匹配controller中的方法url,如果把url和method的关系缓存起来,会不会带来性能上的提升呢?有点恶心的是,负责解析url和method对应关系的ServletHandlerMethodResolver是一个private的内部类,不能直接继承该类增强代码,必须要该代码后重新编译.当然,如果缓存起来,必须要考虑缓存的线程安全问题.
springMvc 启动过程的更多相关文章
- SpringMVC启动过程详解(li)
通过对SpringMVC启动过程的深入研究,期望掌握Java Web容器启动过程:掌握SpringMVC启动过程:了解SpringMVC的配置文件如何配置,为什么要这样配置:掌握SpringMVC是如 ...
- SpringMVC的启动过程
前言 下面是一个SpringMVC应用的配置文件,需要注意两个地方,一个是ContextLoaderListener,一个是dispatcherServlet.web容器正是通过这两个配置才和spri ...
- SpringMVC 启动流程
首先看一下Web应用部署初始化过程 (Web Application Deployement),官方文档说明: Web Application Deployment When a web applic ...
- SpringMVC 原理 - 设计原理、启动过程、请求处理详细解读
SpringMVC 原理 - 设计原理.启动过程.请求处理详细解读 目录 一. 设计原理 二. 启动过程 三. 请求处理 一. 设计原理 Servlet 规范 SpringMVC 是基于 Servle ...
- 转:spring的启动过程-spring和springMVC父子容器的原理
要想很好理解这三个上下文的关系,需要先熟悉spring是怎样在web容器中启动起来的.spring的启动过程其实就是其IoC容器的启动过程,对于web程序,IoC容器启动过程即是建立上下文的过程. s ...
- Spring MVC的启动过程
一.概述 下面一个基本的运用springMVC的的web.xml的配置,这里要注意两个地方,一个是ContextLoadListener,一个是DispatcherServlet.web容器正是通过这 ...
- spring mvc 启动过程及源码分析
由于公司开源框架选用的spring+spring mvc + mybatis.使用这些框架,网上都有现成的案例:需要那些配置文件.每种类型的配置文件的节点该如何书写等等.如果只是需要项目能够跑起来,只 ...
- 关于启动过程及log
1.tomcat的启动过程及log 2.webapp的启动过程及log 3.spring的启动过程及log 4.springmvc的启动过程及log 5.web.xml的启动过程及log
- Tomcat架构解析(二)-----Connector、Tomcat启动过程以及Server的创建过程
Connector用于跟客户端建立连接,获取客户端的Socket,交由Container处理.需要解决的问题有监听.协议以及处理器映射等等. 一.Connector设计 Connector要实现的 ...
随机推荐
- .net Core 使用 iTextSharp 生成PDF 简单示例
在 Nuget 中导入需要的插件: 实现的代码: 1 [HttpGet, Route("CreatePdf")] 2 public Response CreatePdf() 3 { ...
- JAVA使用IDEA本地调试服务的代码
然后将启动参数的 jdwp=transport=dt_socket,server=y,suspend=n,address=8086 放到服务器上 在执行jar包的命令加入这个 例如 java -jar ...
- Linux(centos)系统导出数据库文件命令
mysqldump -uroot -p test > /test.sql -uroot 其中的root是数据库的用户名 test是要导出的数据库名字 test.sql 是要导出的数据库文件名字, ...
- 手把手教你如何使用 webpack5 的模块联邦新特性
想象一下,在webpack5还没出来前,前端使用第三方组件库,例如使用 dayjs 日期处理库,都是通过 npm i dayjs -s 安装 dayjs 模块到项目里,然后就可以通过 require ...
- ubuntu web服务器配置
1.安装Apachesudo apt-get install apache2 查看状态: service apache2 status/start/stop/restartWeb目录: /var/ww ...
- 【剑指Offer】数组中出现次数超过一半的数字 解题报告(Python)
[剑指Offer]数组中出现次数超过一半的数字 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-inter ...
- a.equals(b) 判断对象相等
一.值是null的情况: 1.a.equals(b), a 是null, 抛出NullPointException异常. 2.a.equals(b), a不是null, b是null, 返回fals ...
- 使用Xcode 制作自定义storyboard启动界面,供uniAPP使用。
1新建项目 想要全屏显示并适应所有尺寸的iPad和iphone 需要用750*1624 2X 和 1125 * 2436 3X大小的图片 这里做完就可以导出文件了 把文件和图片放到一起 见下图 命名规 ...
- CS5210完全替代AG6202|HDMI转VGA芯片+原理图|替代兼容AG6202
安格AG6202是一个HDMI转VGA不带音频解决方案,用于实现HDMI1.4高分辨率视频转VGA转换器.Capstone CS5210不管在性能上和设计参数上面都是可以完全替代安格AG6202,且 ...
- emqx启用redis认证插件
本次测试使用的是免费版的 emqx-windows-4.3.10 版本 1.修改redis插件 emqx_auth_redis.conf 设置用户名密码, auth.redis.passwor ...