Spring源码阅读:ContextLoaderListener

spring在web中的启动是由ContextLoaderListener开始的。ContextLoaderListener实现了ServlContextListener接口,并继承了ContextLoader类。

public class ContextLoaderListener extends ContextLoader implements ServletContextListener


笔记如下:

1.ServletContextListener 接口有两个方法:contextInitialized,contextDestroyed。
在服务器加载web应用的时候,这个Listener将被调用。
spring在contextInitialized中进行spring容器的初始化。

this.contextLoader.initWebApplicationContext(event.getServletContext());


2.ContextLoader的initWebApplicationContext方法:

首先判断web应用中是否有spring容器被加载过,如下
if (servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE) != null)


如果有被加载过,将抛出异常。提示是否放置了多个ContextLoaderListener。

3.创建WebApplicationContext前,将先处理父上下文(对于ERA工程而言有用可能)。
普通的web项目,是没有父上下文的。

ApplicationContext parent = loadParentContext(servletContext);

下面这句是创建WebApplicationContext的主过程。

this.context = createWebApplicationContext(servletContext, parent);


创建完的context置于servletContext中,这样Spring容器的宿主就是ServletContext(application Scope)。

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


4.createWebApplicationContext方法:
首先进行ApplicationContext Class的诊断:如果指定了ContextClass但没有实现ConfigurableWebApplicationContext的,将抛出异常。
默认将根据ContextLoader.properties中指定class的实例
即:org.springframework.web.context.support.XmlWebApplicationContext

之后根据Servlet的版本2.4之前及2.5的不同,获取web的DisplayName。
设置ConfigurableWebApplicationContext的id。

最后代码进入实质性的处理
        
wac.setParent(parent);
wac.setServletContext(sc);
//获取configLocation的配置
wac.setConfigLocation(sc.getInitParameter(CONFIG_LOCATION_PARAM));
customizeContext(sc, wac);// 用于自定义ContextClass时,扩充自定义Context
wac.refresh();// 完成context构造过程。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值