文档章节

I.Spring源码分析之web入口

maskleo
 maskleo
发布于 2015/10/13 22:20
字数 775
阅读 22
收藏 0
点赞 0
评论 0

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
	<display-name>Archetype Created Web Application</display-name>
	<!-- 初始化 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value>
	</context-param>
	<!-- 监听器 -->
	<listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
	<!-- 定义struts2的核心filter -->
	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>
			org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
		</filter-class>
	</filter>
	<!-- 让struts定义的核心filter拦截所有请求 -->
	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>*.do</url-pattern>
	</filter-mapping>

	<filter>
		<filter-name>encodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>

	<!-- druid数据库监控 -->
	<filter>
		<filter-name>DruidWebStatFilter</filter-name>
		<filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
		<init-param>
			<param-name>exclusions</param-name>
			<param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>DruidWebStatFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<servlet>
		<servlet-name>DruidStatView</servlet-name>
		<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>DruidStatView</servlet-name>
		<url-pattern>/druid/*</url-pattern>
	</servlet-mapping>

	<!-- 项目欢迎界面 -->
	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
	<error-page>
		<error-code>404</error-code>
		<location>/404.html</location>
	</error-page>
	<error-page>
		<error-code>500</error-code>
		<location>/500.html</location>
	</error-page>
	<error-page>
		<error-code>502</error-code>
		<location>/502.html</location>
	</error-page>
	<error-page>
		<error-code>504</error-code>
		<location>/504.html</location>
	</error-page>
</web-app>

 

Spring 的入口 org.springframework.web.context.ContextLoaderListener

这个类继承了  org.springframework.web.context.ContextLoader

实现了javax.servlet.ServletContextListener接口

在ContextLoader中有一个静态语句块

static {
		// Load default strategy implementations from properties file.
		// This is currently strictly internal and not meant to be customized
		// by application developers.
		try {
			ClassPathResource resource = new ClassPathResource(DEFAULT_STRATEGIES_PATH, ContextLoader.class);
			defaultStrategies = PropertiesLoaderUtils.loadProperties(resource);
		}
		catch (IOException ex) {
			throw new IllegalStateException("Could not load 'ContextLoader.properties': " + ex.getMessage());
		}
	}

注意这个private static final String DEFAULT_STRATEGIES_PATH = "ContextLoader.properties";

我找了一下这个文件

是在ContextLoader.class一个目录下

来看看这个文件

# Default WebApplicationContext implementation class for ContextLoader.
# Used as fallback when no explicit context implementation has been specified as context-param.
# Not meant to be customized by application developers.

org.springframework.web.context.WebApplicationContext=org.springframework.web.context.support.XmlWebApplicationContext

 

注释:默认的WebApplicationContext接口的实现类

在上面的静态语句块的作用是把这个文件读到Properties(defaultStrategies)对象里

ContextLoaderListener实现了ServletContextListener接口 

那么启动服务的入口是这个方法contextInitialized

ContextLoader#initWebApplicationContext(ServletContext servletContext)

--》configureAndRefreshWebApplicationContext(cwac, servletContext);

注意看这一行代码String configLocationParam = sc.getInitParameter(CONFIG_LOCATION_PARAM);

public static final String CONFIG_LOCATION_PARAM = "contextConfigLocation";

这个就是获取web.xml中的内容

<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value>
	</context-param>

获取配置文件的内容 找到spring文件的路径

接下来看wac.setConfigLocation(configLocationParam);

我们直接进这2个方法发现了一个严重的问题   2个方法的实现里面都是直接抛出异常的!!!

说明这个是被禁止调用的?

我再看了下ConfigurableWebApplicationContext    这是一个接口

再回来看到了ConfigurableWebApplicationContext cwac = (ConfigurableWebApplicationContext) this.context;  这个

接着向上找  this.context = createWebApplicationContext(servletContext);

也就是我们找到了创建 wac具体实例的地方

Class<?> contextClass = determineContextClass(sc);
protected Class<?> determineContextClass(ServletContext servletContext) {
		String contextClassName = servletContext.getInitParameter(CONTEXT_CLASS_PARAM);
		if (contextClassName != null) {
			try {
				return ClassUtils.forName(contextClassName, ClassUtils.getDefaultClassLoader());
			}
			catch (ClassNotFoundException ex) {
				throw new ApplicationContextException(
						"Failed to load custom context class [" + contextClassName + "]", ex);
			}
		}
		else {
			contextClassName = defaultStrategies.getProperty(WebApplicationContext.class.getName());
			try {
				return ClassUtils.forName(contextClassName, ContextLoader.class.getClassLoader());
			}
			catch (ClassNotFoundException ex) {
				throw new ApplicationContextException(
						"Failed to load default context class [" + contextClassName + "]", ex);
			}
		}
	}

最重要的是这一行代码:

contextClassName = defaultStrategies.getProperty(WebApplicationContext.class.getName());

我们上面提到在静态语句块里面解析了ContextLoader.properties

得到了

org.springframework.web.context.WebApplicationContext=org.springframework.web.context.support.XmlWebApplicationContext

根据代码我们知道XmlWebApplicationContext就是

wac.setConfigLocation(configLocationParam);

中wac的实例

果然我们在它的父类的父类(AbstractRefreshableConfigApplicationContext)中找到了setConfigLocation方法的实现

看里面的实现是把路径解析到configLocations中

AbstractApplicationContext#refresh()

开始加载解析和加载相关的文件

© 著作权归作者所有

共有 人打赏支持
maskleo
粉丝 14
博文 107
码字总数 17344
作品 0
深圳
程序员
yii2源码分析之执行基本流程

用yii2框架用了将近2年,一直都没有去看过它底层源码, 马上快不用了,最近对其源码研究一番,哈哈 废话少说,上代码, 入口文件是web/index.php

china_lx1 ⋅ 04/22 ⋅ 0

shiro登录流程

ShiroFilter Shiro提供了与Web集成的支持,其通过一个ShiroFilter入口来拦截需要安全控制的URL,然后进行相应的控制,ShiroFilter类似于如Strut2/SpringMVC这种web框架的前端 其是安全控制的...

嘿嘿!! ⋅ 2016/10/20 ⋅ 0

Shiro 源码分析

Shiro 是一个非常优秀的开源项目,源码非常值得学习与研究。 我想尝试做一次 不一样 的源码分析:源码分析不再是一个人的自我享受,而是大家共同探讨与相互学习。 目录 Shiro 之 入口:Envir...

黄勇 ⋅ 2014/04/01 ⋅ 15

Meteor应用的启动过程分析

使用Meteor创建和运行一个应用是非常简单的,而简单的背后就是繁杂的细节。我们希望通过分析源码,抽丝剥茧,来理解这简单背后的细节之美。 meteor v0.9.0.1 运行一个应用 首先我们得创建一个...

hoolev ⋅ 2015/03/23 ⋅ 0

Springboot 随笔(1) -- 自动引入配置与启动机制

为什么用SpringBoot? 同上题记。总结:快速开始,方便搭建,开发web时并不需要Tomcat或者Jetty,甚至连插件都不用(因为自带Tomcat或自配置成Jetty)。 肯定有缺点吧? 一个框架除了知道他的...

alexqdjay ⋅ 2016/10/09 ⋅ 0

Spring Security3源码分析-CAS支持

Spring Security3对CAS的支持主要在这个spring-security-cas-client-3.0.2.RELEASE.jar包中 Spring Security和CAS集成的配置资料很多。这里讲解的比较详细 http://lengyun3566.iteye.com/blo...

Dead_knight ⋅ 2014/01/20 ⋅ 0

Spring源码分析 从web.xml 中ContextLoaderListener看Spring 容器与web容器联系

Spring IOC容器如何与web容器建立联系,使得在web环境下能运用Spring 容器去管理对象,这要从web.xml配置文件中的ContextLoaderListener说起。它是Spring容器与web容器建立联系的入口,这里就...

0909 ⋅ 2016/08/10 ⋅ 0

Spring 源码分析(四) ——MVC(三)源码入口

测试代码 框架配置 现在就从 SpringMVC 的网站开发开始。当然,最先是用 Mavan 下载所需的 jar。下面是 pom.xml 配置: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="ht...

水门-kay ⋅ 2016/03/28 ⋅ 0

php源码分析方法求教

本人最近在分析天天团购源码,但是里面各种的require_once让我有些崩溃。请问各位大神有什么好的方法啊。 在网上找到了如下方法: 一。先把源代码安装起来,结合它的文档和手册,熟悉其功能和...

kong_resty ⋅ 2011/11/09 ⋅ 1

struts2源码分析之配置文件加载顺序

本次源码分析的目标: 弄清struts2加载各配置文件的顺序,得到此配置文件加载顺序,则源码分析任务结束。 引言 问题的引出是由于前些天在oschina上看到的一篇帖子,http://www.oschina.net/...

算法与编程之美 ⋅ 2013/04/09 ⋅ 6

没有更多内容

加载失败,请刷新页面

加载更多

下一页

大数据工程师需要精通算法吗,要达到一个什么程度呢?

机器学习是人工智能的一个重要分支,而机器学习下最重要的就是算法,本文讲述归纳了入门级的几个机器学习算法,加大数据学习群:716581014一起加入AI技术大本营。 1、监督学习算法 这个算法由...

董黎明 ⋅ 34分钟前 ⋅ 0

Kylin 对维度表的的要求

1.要具有数据一致性,主键值必须是唯一的;Kylin 会进行检查,如果有两行的主键值相同则会报错。 2.维度表越小越好,因为 Kylin 会将维度表加载到内存中供查询;过大的表不适合作为维度表,默...

无精疯 ⋅ 38分钟前 ⋅ 0

58到家数据库30条军规解读

军规适用场景:并发量大、数据量大的互联网业务 军规:介绍内容 解读:讲解原因,解读比军规更重要 一、基础规范 (1)必须使用InnoDB存储引擎 解读:支持事务、行级锁、并发性能更好、CPU及...

kim_o ⋅ 41分钟前 ⋅ 0

代码注释中顺序更改 文件读写换行

`package ssh; import com.xxx.common.log.LogFactory; import com.xxx.common.log.LoggerUtil; import org.apache.commons.lang3.StringUtils; import java.io.*; public class DirErgodic ......

林伟琨 ⋅ 49分钟前 ⋅ 0

linux实用操作命令

参考 http://blog.csdn.net/qwe6112071/article/details/50806734 ls [选项] [目录名 | 列出相关目录下的所有目录和文件 -a 列出包括.a开头的隐藏文件的所有文件-A 同-a,但不列出"."和"...

简心 ⋅ 今天 ⋅ 0

preg_match处理中文符号 url编码方法

之前想过直接用符号来替换,但失败了,或者用其他方式,但有有些复杂,这个是一个新的思路,亲测可用 <?php$str='637朗逸·超速新风王(300)(白光)'; $str=iconv("UTF-8","GBK",$s...

大灰狼wow ⋅ 今天 ⋅ 0

DevOps 资讯 | PostgreSQL 的时代到来了吗 ?

PostgreSQL是对象-关系型数据库,BSD 许可证。拼读为"post-gress-Q-L"。 作者: Tony Baer 原文: Has the time finally come for PostgreSQL?(有删节) 近30年来 PostgreSQL 无疑是您从未听...

RiboseYim ⋅ 今天 ⋅ 0

github太慢

1:用浏览器访问 IPAddress.com or http://tool.chinaz.com 使用 IP Lookup 工具获得github.com和github.global.ssl.fastly.net域名的ip地址 2:/etc/hosts文件中添加如下格式(IP最好自己查一...

whoisliang ⋅ 今天 ⋅ 0

非阻塞同步之 CAS

为解决线程安全问题,互斥同步相当于以时间换空间。多线程情况下,只有一个线程可以访问同步代码。这种同步也叫阻塞同步(Blocking Synchronization). 这种同步属于一种悲观并发策略。认为只...

长安一梦 ⋅ 今天 ⋅ 0

云计算的选择悖论如何对待?

人们都希望在工作和生活中有所选择。但心理学家的调查研究表明,在多种选项中进行选择并不一定会使人们更快乐,甚至不会产生更好的决策。心理学家Barry Schwartz称之为“选择悖论”。云计算为...

linux-tao ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部