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的内部类,不能直接继承该类增强代码,必须要该代码后重新编译.当然,如果缓存起来,必须要考虑缓存的线程安全问题.
最新文章
- AT指令调试程序
- Linux下几种文件传输命令 sz rz sftp scp
- SQL-基础知识
- [BZOJ1659][Usaco2006 Mar]Lights Out 关灯
- 【巧妙思维】【4-6】Problem F
- 深入理解Stream流水线
- sleep()方法和wait()方法之间有什么差异?
- 算法提高 金属采集 树形DP
- python构造一个freebuf新闻发送脚本
- Spring Boot 整合 elasticsearch
- 【转】Ubuntu 64位系统安装交叉编译环境一直提醒 没有那个文件或目录
- adb查看安卓设备系统Android版本
- redis(一)--认识redis
- Hibernate 再接触 多对多单向双向关联
- Java模式—适配器模式
- How to correctly handle ThreadLocal.get() returning null
- T24银行核心业务系统
- python2.0_day19_前端分页功能的实现
- Java集合篇二:LinkList
- 再学UML-深入浅出UML类图(四)
热门文章
- xfs文件系统修复方法https://blog.csdn.net/yuanfang_way/article/details/78700089
- JS设置网站所有字体变为繁体字
- soundcloud to mp3
- 【剑指Offer】把数组排成最小的数 解题报告(Python)
- Fence(poj1821)
- BestCoder Round #66 (div.2)B GTW likes gt
- 教学日志:javaSE-数组
- Universal adversarial perturbations
- [数据结构]链表相关的实现LinkList.cpp
- JSP的数据从数据库中获取导入type=date的input标签中