Spring3.1.0实现原理分析(十一).MVC从桌面到web应用
2017-06-01 11:10
766 查看
大家好,从这篇博客开始我们开始探讨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) 方法中执行的,具体步骤如下。
获取web容器类型,默认是org.springframework.web.context.support.XmlWebApplicationContext,然后实例化web容器。
重置web容器Id, 容器实例化后的Id没什么意义,如“XmlWebApplicationContext@e5a2e6”,给它取个更有意义的名称,名称用户可以指定,如果未指定spring自动生成,不同的servlet版本略有区别,总之名称里会包含应用名称。
为web容器设置父容器, 通常父容器都是null,这里不展开了。
把ServletContext赋值给web容器的成员变量。
获取spring资源文件路径赋值给web容器的成员变量。
引用配置的容器初始化器,对web容器执行初始化操作,如果用户没有配置的话,默认是没有容器初始化器的。
上述步骤1到6都是针对web容器的特有操作,而步骤7是要调用容器的refresh()方法,这是一个特别重要的方法,这个方法一旦执行就意味着web容器创建完成。这个方法并非web容器特有,而是spring传统桌面应用的方法。
备注,初始化完毕的web容器会被置入ServletContext的属性集,key是"org.springframework.web.context.WebApplicationContext.ROOT"。
另外,web容器会通过重写传统容器的postProcessBeanFactory(beanFactory)方法,在创建容器过程中增加些额外处理,主要会执行如下操作。
重写了获取默认spring资源文件路径方法,默认路径是[/WEB-INF/namespace-servlet.xml,namespace的默认自就是servletname。不过这里基本上用户是会指定spring配置文件路径的,不会使用默认路径。
重写了获取资源对象的方法,返回基于ServletContext的资源对象,该资源对象的特点是通过ServletContext#getResource(path)方法获取资源。
重写了获取环境对象的方法,返回StandardServletEnvironment对象,这个对象是StandardEnvironment的派生类,在超类基础上,它会把ServletContext#InitParameter和ServletConfig#InitParameter属性作为属性源。可以看下这篇博客《Spring3.1.0实现原理分析(三).配置数据》。
注册web应用特有的范围对象,“request范围对象”,“session范围对象”,“全局session范围对象”,“servletContext范围对象”,这几个范围对象的使用方法后续介绍,传统桌面的范围对象有单例和属性。
往bean工厂注册几个单例bean对象,如下,
1) .key:servletContext; value:servletContext对象。
2). key:servletConfig; value:servletConfig对象。注意:对于根web容器而言是取不到servletConfig对象的,因此不会注册,但是子web容器就不同了。
3). key:contextParameters; value:一个map对象,里面的内容是servletContext#InitParameter。
4). key:contextAttributes; value:一个map对象,里面的内容是servletContext#Attribute。
三. web容器的销毁过程
web容器的销毁操作是在ServletContextListener接口的contextDestroyed(ServletContextEvent event) 方法中执行的,会在方法中调用容器的close()方法,close()方法
主要功能是释放跟容器有关的锁和资源,销毁所有单例bean对象。可以看下这篇博客关于bean善后处理的论述,《 Spring3.1.0实现原理分析(七).》。
最后补充一个重要概念,在ContextLoaderListener中创建的web容器是根web容器,难道还有子web容器,请关注下篇博客,:)
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) 方法中执行的,具体步骤如下。
获取web容器类型,默认是org.springframework.web.context.support.XmlWebApplicationContext,然后实例化web容器。
重置web容器Id, 容器实例化后的Id没什么意义,如“XmlWebApplicationContext@e5a2e6”,给它取个更有意义的名称,名称用户可以指定,如果未指定spring自动生成,不同的servlet版本略有区别,总之名称里会包含应用名称。
为web容器设置父容器, 通常父容器都是null,这里不展开了。
把ServletContext赋值给web容器的成员变量。
获取spring资源文件路径赋值给web容器的成员变量。
引用配置的容器初始化器,对web容器执行初始化操作,如果用户没有配置的话,默认是没有容器初始化器的。
上述步骤1到6都是针对web容器的特有操作,而步骤7是要调用容器的refresh()方法,这是一个特别重要的方法,这个方法一旦执行就意味着web容器创建完成。这个方法并非web容器特有,而是spring传统桌面应用的方法。
备注,初始化完毕的web容器会被置入ServletContext的属性集,key是"org.springframework.web.context.WebApplicationContext.ROOT"。
servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context);
另外,web容器会通过重写传统容器的postProcessBeanFactory(beanFactory)方法,在创建容器过程中增加些额外处理,主要会执行如下操作。
重写了获取默认spring资源文件路径方法,默认路径是[/WEB-INF/namespace-servlet.xml,namespace的默认自就是servletname。不过这里基本上用户是会指定spring配置文件路径的,不会使用默认路径。
重写了获取资源对象的方法,返回基于ServletContext的资源对象,该资源对象的特点是通过ServletContext#getResource(path)方法获取资源。
重写了获取环境对象的方法,返回StandardServletEnvironment对象,这个对象是StandardEnvironment的派生类,在超类基础上,它会把ServletContext#InitParameter和ServletConfig#InitParameter属性作为属性源。可以看下这篇博客《Spring3.1.0实现原理分析(三).配置数据》。
注册web应用特有的范围对象,“request范围对象”,“session范围对象”,“全局session范围对象”,“servletContext范围对象”,这几个范围对象的使用方法后续介绍,传统桌面的范围对象有单例和属性。
往bean工厂注册几个单例bean对象,如下,
1) .key:servletContext; value:servletContext对象。
2). key:servletConfig; value:servletConfig对象。注意:对于根web容器而言是取不到servletConfig对象的,因此不会注册,但是子web容器就不同了。
3). key:contextParameters; value:一个map对象,里面的内容是servletContext#InitParameter。
4). key:contextAttributes; value:一个map对象,里面的内容是servletContext#Attribute。
三. web容器的销毁过程
web容器的销毁操作是在ServletContextListener接口的contextDestroyed(ServletContextEvent event) 方法中执行的,会在方法中调用容器的close()方法,close()方法
主要功能是释放跟容器有关的锁和资源,销毁所有单例bean对象。可以看下这篇博客关于bean善后处理的论述,《 Spring3.1.0实现原理分析(七).》。
最后补充一个重要概念,在ContextLoaderListener中创建的web容器是根web容器,难道还有子web容器,请关注下篇博客,:)
相关文章推荐
- Spring3.1.0实现原理分析(十一).MVC-从桌面到web应用
- Spring3.1.0实现原理分析(十二).MVC核心类DispatcherServlet初始化过程
- Spring3.1.0实现原理分析(十七).MVC请求处理方法参数解析器和返回值解析器
- Spring3.1.0实现原理分析(十三).MVC请求映射信息RequestMappingInfo详解
- Spring3.1.0实现原理分析(十七).MVC请求处理方法参数解析器和返回值解析器
- Spring3.1.0实现原理分析(十六).MVC数据绑定器
- Spring3.1.0实现原理分析(十三).MVC请求映射信息RequestMappingInfo详解
- Spring3.1.0实现原理分析(十二).MVC核心类DispatcherServlet初始化过程
- Spring3.1.0实现原理分析(十六).MVC数据绑定器
- Spring3.1.0实现原理分析(六).实例化
- Spring3.1.0实现原理分析(四).属性访问器(PropertyAccessor)
- Spring3.1.0实现原理分析(八).获取bean对象
- Spring3.1.0实现原理分析(七).填充Bean属性,初始化Bean,登记善后处理,注册单例Bean
- Spring3.1.0实现原理分析(十).AOP之代理对象执行拦截过程
- Spring3.1.0实现原理分析(三).配置数据
- Spring3.1.0实现原理分析(五).关于循环引用的探讨
- Spring3.1.0实现原理分析(二).国际化(i18n)
- Spring3.1.0实现原理分析(八).获取bean对象
- Spring3.1.0实现原理分析(十四).MVC之处理器映射
- Spring3.1.0实现原理分析(十四).MVC之处理器映射