Spring 通篇源码 之 启动 之 程序入口分析

欢迎大家关注本博,同时欢迎大家评论交流,可以给个赞哦!!!

Spring 通篇源码 基于 spring-framework-4.1.7.RELEASE 版本。

  基于Spring搭建项目时,会在web.xml中配置Spring需要的相关信息,web.xml配置是Spring框架运行必须的(当然Spring boot可以完全无配置启动,依据本文开头的声明,基于 spring-framework-4.1.7.RELEASE 版本),配置的内容会启动Spring容器,包括大家熟知的Ioc和AOP都是以这里为起点的,先看一下配置内容,让我们逐项分析一下。

  web.xml Spring 配置

<listener>
	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
	<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>
	classpath*:/spring/applicationContext.xml
	</param-value>
</context-param>
<filter>
	<filter-name>characterEncodingFilter</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>
	<init-param>
		<param-name>forceEncoding</param-name>
		<param-value>true</param-value>
	</init-param>
</filter>
<filter-mapping>
	<filter-name>characterEncodingFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
	<servlet-name>springMVCServlet</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<init-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
		classpath*:/spring/applicationContext.mvc.xml
		</param-value>
	</init-param>
	<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
	<servlet-name>springMVCServlet</servlet-name>
	<url-pattern>/*</url-pattern>
</servlet-mapping>

  配置功能分析

  ① org.springframework.web.context.ContextLoaderListener

<listener>
	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>
	classpath*:/spring/applicationContext.xml
	</param-value>
</context-param>

  ContextLoaderListener继承了ContextLoader,实现了ServletContextListener接口,web.xml中与元素配合一起完成ContextLoaderListener的配置,ContextLoaderListener的作用是在Servlert容器启动时,读取contextConfigLocation变量指向的xml配置文件,根据文件描述装配ApplicationContext的配置,并产生WebApplicationContext对象。在Servlet容器关闭时,销毁WebApplicationContext对象。

  ContextLoaderListener为什么要继承ServletContextListener?

  ServletContextListener事件可以监听到ServletContext对象的生命过程,ServletContext是一个全局性的对象,可以等价于Servlet容器(一般Servlet容器就代表Web应用程序)的生命周期。正是由于ContextLoaderListener继承了ServletContextListener,Spring才可以在Servlet容器启动和关闭时完成初始化和销毁操作。

  ② org.springframework.web.context.request.RequestContextListener

<listener>
	<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

  RequestContextListener实现了ServletRequestListener接口,可以使得RequestContextListener可以在Servlet容器运行期间的所有请求,Servlet容器的每一次请求都会通知该监听器。

  RequestContextListener作用:

   · RequestContextListener可以用于监听请求,基于ThreadLocal把HttpServletRequest对象绑定到当前线程上,使得线程后续操作中可以直接获取。

   · Spring 4.1.7.RELEASE版本中,Bean可以拥有五种作用域:singleton、prototype、request、session和global session。request、session和global session是Spring 2.x新增的Web作用域,若希望Bean拥有这三项中的某种作用域,除了在Bean生命时通过scope属性标注外,还需要增加上面的配置。

   · 若Servlet容器的Servlet API是2.4之前的版本,那需要定义一个Filter实现:

<filter>  
    <filter-name>requestContextFilter</filter-name>  
    <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>  
</filter>  
<filter-mapping>  
    <filter-name>requestContextFilter</filter-name>  
    <url-pattern>/*</url-pattern>  
</filter-mapping>

​ ③ org.springframework.web.filter.CharacterEncodingFilter

<filter>
	<filter-name>characterEncodingFilter</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>
	<init-param>
		<param-name>forceEncoding</param-name>
		<param-value>true</param-value>
	</init-param>
</filter>
<filter-mapping>
	<filter-name>characterEncodingFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

  CharacterEncodingFilter是Spring内置的过滤器,主要用来处理请求和响应的编码问题。上面的配置指示:拦截到Servlet容器的所有请求,编码格式为UTF-8,禁止应用进行修改。CharacterEncodingFilter具有过滤器的所有特性,可在请求达到Servlet前和响应发送到客户端之前, 进行过滤处理,可修改请求和响应的头信息以及有效负载数据。

  ④ org.springframework.web.servlet.DispatcherServlet

<servlet>
	<servlet-name>springMVCServlet</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<init-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
		classpath*:/spring/applicationContext.mvc.xml
		</param-value>
	</init-param>
	<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
	<servlet-name>springMVCServlet</servlet-name>
	<url-pattern>/*</url-pattern>
</servlet-mapping>

  DispatcherServlet是前置控制器,是Spring应用请求的集中访问点,负责接收请求并根据响应规则进行请求分派。contextConfigLocation指定Spring MVC xml配置文件路径。

  总结

  至此,Spring在web.xml中的配置大致介绍就完成了,这些内容是一个Spring应用必不可少的,在这些配置的合作下,完成Spring Ioc容器、Spring MVC流程控制、Spring 编码处理等等事项。

  若文中存在错误和不足,欢迎指正!

本博微信公众号“超哥说码”,欢迎大家订阅,公众号正在完善中,会及时将更优质的博文推送于您!
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/securitit/article/details/108100904