《WebApplicationContext初始化

ApplicationContext是Spring的核心,Context我们通常解释为上下文环境,我想用“容器”来表述它更容易理解一些,ApplicationContext则是“应用的容器”了;在Web应用中,我们会用到WebApplicationContext,WebApplicationContext继承自ApplicationContext;WebApplicationContext的初始化方式和BeanFactory.ApplicationContext有所区别,因为WebApplicationContext需要ServletContext实例,也就是说它必须拥有Web容器的前提下才能完成启动的工作.有过Web开发经验的读者都知道可以在web.xml中配置自启动的Servlet或定义Web容器监听器(ServletContextListener),借助着两者中的任何一个,我们就可以启动Spring Web应用上下文的工作.

Spring分别提供了用于启动WebApplicationContext的Servlet和Web容器监听器:

org.springframework.web.context.ContextLoaderServlet;

org.springframework.web.context.ContextLoaderListener.

这两个方法都是在web应用启动的时候来初始化WebApplicationContext,我个人认为Listerner要比Servlet更好一些,因为Listerner监听应用的启动和结束,而Servlet得启动要稍微延迟一些,如果在这时要做一些业务的操作,启动的前后顺序是有影响的。

配置例子如下:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>

<listener>
<listener-class>

org.springframework.web.context.ContextLoaderListener

</listener-class>
</listener>

那么在ContextLoaderListener和ContextLoaderServlet中到底做了什么呢?
以ContextLoaderListener为例,我们可以看到
public void contextInitialized(ServletContextEvent event) {
this.contextLoader = createContextLoader();
this.contextLoader.initWebApplicationContext(event.getServletContext());
}
protected ContextLoader createContextLoader() {
return new ContextLoader();
}
ContextLoader是一个工具类,用来初始化WebApplicationContext,其主要方法就是initWebApplicationContext,我们继续追踪initWebApplicationContext这个方法(具体代码我不贴出,大家可以看Spring中的源码),我们发现,原来ContextLoader是把WebApplicationContext(XmlWebApplicationContext是默认实现类)放在了ServletContext中,ServletContext也是一个“容器”,也是一个类似Map的结构,而WebApplicationContext在ServletContext中的KEY就是WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,我们如果要使用WebApplicationContext则需要从ServletContext取出,Spring提供了一个WebApplicationContextUtils类,可以方便的取出WebApplicationContext,只要把ServletContext传入就可以了。

转载于:https://blog.51cto.com/longx/1321153

WebApplicationContext初始化相关推荐

  1. 【Spring MVC学习】WebApplicationContext初始化的三种方式

    ApplicationContext是Spring的核心,Context我们通常解释为上下文环境,我想用"容器"来表述它更容易理解一些,ApplicationContext则是&q ...

  2. spring项目的 WebApplicationContext 初始化两次的解决方法

    从图中可以看到Initializing Spring root WebApplicationContext两次初始化之间仅仅相隔了 5秒钟. 问题的原因是.settings/org.eclipse.w ...

  3. SpringMVC深度探险(三) —— DispatcherServlet与初始化主线

    本文是专栏文章(SpringMVC深度探险)系列的文章之一,博客地址为:http://downpour.iteye.com/blog/1341459. 在上一篇文章中,我们给出了构成SpringMVC ...

  4. Spring WebApplicationContext

    WebApplicationContext是专门为web应用准备的,他允许从相对于web根目录的路劲中装载配置文件完成初始化工作,从WebApplicationContext中可以获得ServletC ...

  5. Spring MVC源码——Root WebApplicationContext

    Spring MVC源码--Root WebApplicationContext 打算开始读一些框架的源码,先拿 Spring MVC 练练手,欢迎点击这里访问我的源码注释, SpringMVC官方文 ...

  6. java dispatcher详解_dispatcherservlet初始化过程详解

    之前给大家介绍了什么是dispatcherservlet,以及dispatcherservlet配置等方面的内容,那么下面要接着给大家介绍的就是dispatcherservlet初始化过程,一起来了解 ...

  7. DispatcherServlet与初始化主线

    在上一篇文章中,我们给出了构成SpringMVC应用程序的三要素以及三要素的设计过程.让我们来归纳一下整个设计过程中的一些要点: SpringMVC将Http处理流程抽象为一个又一个处理单元 Spri ...

  8. (3)DispatcherServlet与初始化主线

    在上一篇文章中,我们给出了构成SpringMVC应用程序的三要素以及三要素的设计过程.让我们来归纳一下整个设计过程中的一些要点: SpringMVC将Http处理流程抽象为一个又一个处理单元 Spri ...

  9. java单元测试启动类配置_Springboot 单元测试简单介绍和启动所有测试类的方法

    最近一段时间都是在补之前的技术债,一直忙着写业务代码没有注重代码的质量,leader也在强求,所有要把单元测试搞起来了 我把单元测试分为两种 一个是service的单元测试,一个是controller ...

最新文章

  1. mybatis学习笔记二(接口注解)
  2. DNS服务在网络中的应用
  3. QML基础类型之geocircle
  4. 计算机科学825,2017年河南大学计算机与信息工程学院825专业基础课(软件工程导论、数据结构)之数据结构考研题库...
  5. php eval 语法错误,PHP eval和捕获错误(尽可能多)
  6. mac 解压_BetterZip for Mac(Mac解压压缩工具)
  7. WebSocket使用,包括服务端和客户端(JAVA实现)
  8. 关于linux下的iptables 的浅析命令和了解
  9. PHP TP5框架 发送短信验证码
  10. PPT文件压缩方法有哪些?
  11. 基于注解和EasyExcel指定单元格下拉选内容
  12. 为什么说阿里云和亚马逊云对比,阿里云的性价比比较低?
  13. 再读《投资中最简单的事》
  14. 面对疫情,健身俱乐部管理者最应该做的6件事
  15. 电脑W ndoWs在哪里,苹果电脑如何安装wndows系统.doc
  16. 【STM32CubeMX安装】
  17. Opencv Mat记录
  18. 交通安全评价方法简介
  19. 落尘曦的书籍分享-数据库相关书籍
  20. 2023年网络安全比赛--网页渗透测试中职组(超详细)

热门文章

  1. Space-Filling Designs
  2. gbdt如何处理多分类问题(multiclass,cart)
  3. r语言可以写c程序吗,[求助]R一般用什么写程序?
  4. 【存储知识学习】第五章-5.1-5.3 RAID磁盘阵列-《大话存储》 阅读笔记
  5. LeetCode:64. 最小路径和
  6. LeetCode:63. 不同路径 II
  7. gradle不能下载最新依赖包问题
  8. Nodejs中搭建一个静态Web服务器,通过读取文件获取响应类型
  9. Winform中实现ZedGraph不显示y=0这条刻度线
  10. Winforn中怎样在窗体中打开另一个窗体