文档章节

Spring3.1.0实现原理分析(十一).MVC-从桌面到web应用

 叶琎宇
发布于 2017/06/01 22:39
字数 1160
阅读 9
收藏 1
点赞 0
评论 0

       大家好,从这篇博客开始我们开始探讨Spring's MVC模块,分析它的功能,解密它的实现原理。分析MVC模块,首先是要讲明白spring在web应用中是如何被加载的,当一个 web应用启动和卸载时,spring都会执行哪些操作呢?

       spring通往web应用的走廊是org.springframework.web.context.ContextLoaderListener(容器加载监听器),这是一个Servlet规范的监听器,实现了ServletContextListener接口,当web应用启动和卸载时会分别回调接口的contextInitialized(ServletContextEvent event) 和contextDestroyed(ServletContextEvent event) 方法,spring就在这两个方法中执行初始化和销毁功能。

一. web容器的全局配置

可以在web.xml文件中通过全局参数<context-param>对spring执行配置,具体可配置参数及其功能如下,

  • contextClass   ----- 配置web容器的类型,如未指定默认是org.springframework.web.context.support.XmlWebApplicationContext。
  • contextId    -----  配置web容器的Id, 如未指定spring会自己给web容器取个名字,不同的servlet版本略有区别,总之名称里会包含应用名称。
  • contextInitializerClasses ---- 配置容器初始化器的类型,多个值用逗号分隔,容器初始化器实现了ApplicationContextInitializer接口,在初始化web容器的过程中,会调用ApplicationContextInitializer接口的void initialize(C applicationContext)方法,对web容器执行初始化操作。
  • contextConfigLocation --- 这个最常用,指定spring的资源文件路径,如,/WEB-INF/spring/applicationContext*.xml,如果用户未配置,默认加载“/WEB-INF/applicationContext.xml"。
  • parentContextKey 和 locatorFactorySelector----- 这两个配置项跟父容器相关。

二. web容器的初始化过程

  web容器的初始化操作是在ServletContextListener接口的contextInitialized(ServletContextEvent event) 方法中执行的,具体步骤如下。

  1. 获取web容器类型,默认是org.springframework.web.context.support.XmlWebApplicationContext,然后实例化web容器。
  2.  重置web容器Id, 容器实例化后的Id没什么意义,如“XmlWebApplicationContext@e5a2e6”,给它取个更有意义的名称,名称用户可以指定,如果未指定spring自动生成,不同的servlet版本略有区别,总之名称里会包含应用名称。
  3. 为web容器设置父容器, 通常父容器都是null,这里不展开了。
  4. 把ServletContext赋值给web容器的成员变量。
  5. 获取spring资源文件路径赋值给web容器的成员变量。
  6. 引用配置的容器初始化器,对web容器支持初始化操作,通常如果用户没有配置的话,是没有容器初始化器的。
  7. 上述步骤1到6都是针对web容器的特有操作,而步骤7是要调用容器的refresh()方法,这是一个特别重要的方法,这个方法一旦执行就意味着spring初始化完毕。这个方法并非web容器特有,而是spring传统桌面应用的方法。

 备注,初始化完毕的web容器会被置入ServletContext的属性集,key是WebApplicationContext.ROOT。

servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context);

    另外,web容器在初始化时的某些行为覆盖了传统桌面容器的逻辑,覆盖是通过派生类重写超类方法实现的,主要差别有有如下。

  1. 提供默认spring资源文件路径,默认路径是/WEB-INF/applicationContext.xml  或 /WEB-INF/Namespace.xml (如果用户配置了Namespace)
  2. 重写了超类获取资源对象的方法,返回基于ServletContext的资源对象,该资源对象的特点是通过ServletContext#getResource(path)方法获取资源。
  3. 重写了超类获取环境对象的方法,返回StandardServletEnvironment对象,这个对象是StandardEnvironment的派生类,在超类基础上,它会把ServletContext#InitParameter和ServletConfig#InitParameter属性作为属性源。可以看下这篇博客《Spring3.1.0实现原理分析(三).配置数据》
  4. 注册web应用特有的范围对象,“request范围对象”,“session范围对象”,“全局session范围对象”,“servletContext范围对象”,这几个范围对象的使用方法后续介绍,传统桌面的范围对象有单例和属性。
  5. 往bean工厂注册三个单例bean对象,如下,

   1) .key:servletContext;          value:servletContext对象。

   2). key:contextParameters;     value:一个map对象,里面的内容是servletContext#InitParameter。

   3). key:contextAttributes;         value:一个map对象,里面的内容是servletContext#Attribute。

三. web容器的销毁过程

web容器的初始化操作是在ServletContextListener接口的contextDestroyed(ServletContextEvent event) 方法中执行的,会在方法中调用容器的close()方法,close()方法

主要功能是释放跟容器有关的锁和资源,销毁虽有单例bean对象。可以看下这篇博客关于bean善后处理的论述,《 Spring3.1.0实现原理分析(七).》

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
粉丝 4
博文 25
码字总数 36889
作品 0
宁波
高级程序员
java程序猿技术栈

一、java 基础知识 1.1 java基础集合类 1.2 jdk1.5、1.6、1.7、1.8 特效比较 1.3 java异常处理 1.4 jvm原理及常见问题 1.5 log4j等日志收集 1.6 jdbc驱动 1.7 jdk反射机制使用和原理 1.8 ja...

南寒之星
2016/11/30
17
0
2015-2016前端体系技术图谱

2015-2016前端架构体系技术 进入github查看大图 点击查看完整版 一、框架与组件  **bootstrap等UI框架设计与实现 伸缩布局:grid网格布局 基础UI样式:元素reset、按钮、图片、菜单、表单 ...

ouven
2016/01/26
18.2K
43
ASP.NET MVC是如何运行的[1]: 建立在“伪”MVC框架上的Web应用

ASP.NET由于采用了管道式设计,具有很好的扩展性,而整个ASP.NET MVC应用框架就是通过扩展ASP.NET实现的。通过上面对ASP.NET管道设计的介绍,我们知道ASP.NET的扩展点只要体现在HttpMoudle和...

长平狐
2012/09/04
87
0
2015-2016前端知识体系

本文作者总结了这两年前端的主流技术,对应技术博客地址:http://ouvens.github.io 一、框架与组件 bootstrap等UI框架设计与实现 伸缩布局:grid网格布局 基础UI样式:元素reset、按钮、图片...

数通畅联
2016/03/30
141
0
2015-2016前端知识体系

一、框架与组件 bootstrap等UI框架设计与实现 伸缩布局:grid网格布局 基础UI样式:元素reset、按钮、图片、菜单、表单 组件UI样式:按钮组、字体图标、下拉菜单、输入框组、导航组、面包屑、...

情人情人
2016/03/29
177
0
桌面软件开发框架--joyWindow

joyWindow是基于java后台处理,HTML界面展示的桌面软件开发框架.同时整合了一个类 struts 2.0的wox框架,和velocity解析. 简介: joywindow是的目标是用java语言与HTML显示来构建桌面应用程序....

supperman
2011/04/21
3.1K
0
Spring MVC 原理探秘 - 一个请求的旅行过程

1.简介 在前面的文章中,我较为详细的分析了 Spring IOC 和 AOP 部分的源码,并写成了文章。为了让我的 Spring 源码分析系列文章更为丰富一些,所以从本篇文章开始,我将来向大家介绍一下 Sp...

coolblog.xyz
07/02
0
0
三流程序员与一流程序员之间的区别,看看你是属于哪一类?

源码系列 手写spring mvc框架 基于Spring JDBC手写ORM框架 实现自己的MyBatis Spring AOP实战之源码分析 Spring IOC高级特性应用分析 ORM框架底层实现原理剖析 手写Spring MVC框架实现 手把手...

茶轴的青春
04/17
0
0
《java 进阶之路》 上

整整一月没有更新博客了,因为十月份和双十一新入手的6本技术相关的书,这个月看完了3本,后面的3本还得慢慢肯。 下面我就介绍下进阶高级工程师必须也是我自己都看的一些书和知识点。 1.深入...

jijs
2017/11/29
0
0
Spring MVC 原理探秘 - 容器的创建过程

1.简介 在上一篇文章中,我向大家介绍了 Spring MVC 是如何处理 HTTP 请求的。Spring MVC 可对外提供服务时,说明其已经处于了就绪状态。再次之前,Spring MVC 需要进行一系列的初始化操作。...

coolblog.xyz
07/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

python浏览器自动化测试库【2018/7/22-更新】

64位py2.7版本 更新 document_GetResources 枚举页面资源 document_GetresourceText 获取指定url的内容 包括页面图片 下载地址下载地址 密码:upr47x...

开飞色
18分钟前
20
0
关于DCL双重锁失效及解决方案

关于DCL双重锁失效及解决方案 Double Check Lock (DCL)实现单例 DCL 方式实现单例的优点是既能够在需要时才初始化单例,又能够保证线程安全,且单例对象初始化后调用getInstance方法不进行...

DannyCoder
24分钟前
0
0
PowerDesigner 16.5 安装配置

PowerDesigner16.5破解版是一款业内领先且开发人员常用的数据库建模工具,PowerDesigner可以从物理和概念两个层面设计数据库,方便用户制作处清晰直观的数据流程图和结构模型,欢迎有需要的朋...

Gibbons
49分钟前
0
0
mac Homebrew 指令积累

1通用命令 brew install [包名] //安装包 brew list //列举安装的包 brew info [包名] // 显示安装包的详细信息 mysql 相关 #启动mysql 服务 brew service start mysql my...

Kenny100120
今天
0
0
前端Tips: 创建, 发布自己的 Vue UI 组件库

创建, 发布自己的 Vue UI 组件库 前言 在使用 Vue 进行日常开发时, 我们经常会用到一些开源的 UI 库, 如: Element-UI, Vuetify 等. 只需一行命令, 即可方便的将这些库引入我们当前的项目: n...

ssthouse_hust
今天
1
0
大数据教程(2.13):keepalived+nginx(多主多活)高可用集群搭建教程【自动化脚本】

上一章节博主为大家介绍了目前大型互联网项目的keepalived+nginx(主备)高可用系统架构体系,相信大家应该看了博主的文章对keepalived/nginx技术已经有一定的了解,在本节博主将为大家分享k...

em_aaron
今天
4
0
Git 2.18版本发布:支持Git协议v2,提升性能

在最新的官方 Git 客户端正式版2.18中添加了对 Git wire 协议 v2 的支持,并引入了一些性能与 UI 改进的新特性。在 Git 的核心团队成员 Brandon Williams 公开宣布这一消息前几周,Git 协议 ...

六库科技
今天
0
0
Java8新特性之接口

在JDK8以前,我们定义接口类中,方法都是抽象的,并且不能存在静态方法。所有的方法命名规则基本上都是 public [返回类型] [方法名](参数params) throws [异常类型] {}。 JDK8为接口的定义带...

developlee的潇洒人生
今天
0
0
aop + annotation 实现统一日志记录

aop + annotation 实现统一日志记录 在开发中,我们可能需要记录异常日志。由于异常比较分散,每个 service 方法都可能发生异常,如果我们都去做处理,会出现很多重复编码,也不好维护。这种...

长安一梦
今天
2
0
将博客搬至CSDN

AHUSKY
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部