Spring-WebApplicationContext解读
- 概述
- Web应用环境下Bean的作用域
- WebApplicationContext类体系结构
- ConfigurableWebApplication
- WebApplicationContext初始化
- 使用ContextLoaderLisetener启动WebApplicationContext
- WebApplicationContext中的日志文件的两种配置方式
- 如何在项目中使用Log4j 2
- 使用JavaConfigJava注解的方式启动
- 使用Groovy DSL配置Bean信息
概述
WebApplicationContext是专门为web应用准备的,它允许从相对于Web根目录的路径中装载资源配置文件完成初始化工作。
从WebApplication中可以获取ServletContext的引用,整个Web应用上线文对象作为属性放在到ServletContext中,以便Web应用能访问Spring应用上下文。
Spring专门为此提供了一个工具类WebApplicationContextUtils,通过该类的getWebApplicationContext(ServletContext sc)方法,可以从ServletContext中获取WebApplicationContext实例。
Web应用环境下Bean的作用域
在非Web环境下,Bean只有single和prototype两种作用域。
WebApplicationContext为Bean添加了3个新的作用域
- request
- session
- globalSession
WebApplicationContext类体系结构
由类继承图可以看出,WebApplicationContext扩展了ApplicationContext。
WebApplicationContext定义了一个常
ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,在上线文启动的时候。
WebApplicationContext实例即以此为键放在ServletContext的属性列表中,可以通过下面的语句从Web容器中获取WebApplicationContext
WebApplicationContext wac = (WebApplicationContext)servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE)
正式WebApplicationUtils工具类getWebApplicationContext(ServletContext sc)方法的内部实现。
这样Spring的Web应用上下文和Web容器的上下文应用就可以实现互访,二者实现了融合。
ConfigurableWebApplication
ConfigurableWebApplicationContext 扩展了WebApplicaiton, 它允许通过配置的方式实例化WebApplicationContext,其中两个重要的方法:
void setServletContext(ServletContext servletContext);
为Spring设置Web应用上下文,以便二者整合。
void setConfigLocations(String... configLocations);
设置Spring配置文件地址,如/WEB-INF/smart-dao.xml ,/WEB-INF/smart-service.xml ,配置文件地址是相对于web根目录的地址。
但用户也可以使用带有资源前缀类型的地址 如 classpath:/com/smart/beans.xml
WebApplicationContext初始化
WebApplicationContext的初始化方式,不同于BeanFactory、ApplicationContext, WebApplicationContext需要ServletContext实例,也就是说必须拥有Web容器的前提下才能完成启动。
通常情况下,在web.xml中配置自启动的Servlet或者定义Web容器监听器(ServletContextListener),借助二者中的任何一个,就可以完成Spring Web应用上下文的启动工作。
注意:
所有的版本的Web容器都可以定义自启动的Servlet,但是只有Servlet2.3及以上版本的Web容器才支持Web容器监听器
Spring分别提供了用于启动WebApplicationContext的Servlet和Web容器监听器:
- org.springframework.web.context.ContextLoaderServlet(spring3.0及以后版本中已删除)
- org.springframework.web.context.ContextLoaderListener
3.0之后的版本只能选择ContextLoaderListener实现,并在web.xml中配置完成。
使用ContextLoaderLisetener启动WebApplicationContext
<!--(1) 从类路径下加载Spring配置文件,classpath关键字--><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-context.xml</param-value></context-param><!--(2)负责启动Spring容器的监听器,它将引用(1)处的上下文参数获得Spring配置文件的地址 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>
ContextLoaderListener通过Web容器上下文参数contextConfigLocation获取Spring配置文件的位置,可以自动多个配置文件,用逗号 空格 或者冒号分开均可。
对于未带资源类型前缀的配置文件路径,WebApplicationContext默认这些路径相对于Web的根路径部署。当然也可以采用带资源类型前缀的路径配置,如 classpath:spring-context.xml
.
WebApplicationContext中的日志文件的两种配置方式
由于WebApplicationContext启动需要使用日志功能
两种配置方式:
- 将Log4J的配置文件放在类路径class下,这时Log4J引擎可以顺利启动。
放在其他位置,必须在web.xml中通过Log4jConfigListener加载
(Log4jConfigListener在 Spring 4.2.1及以后被废弃)
Apache Log4j 2 : https://logging.apache.org/log4j/2.x/
Apache Log4j 2 is an upgrade to Log4j that provides significant improvements over its predecessor, Log4j 1.x, and provides many of the improvements available in Logback while fixing some inherent problems in Logback’s architecture.
<!--(1) 从类路径下加载Spring配置文件,classpath关键字--><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-context.xml</param-value></context-param><!-- 如果log4j并没有放到类路径的根目录下,比如放在了/WEB-INF/log4j.properties,需要在web.xml中加载 如下 --><context-param><param-name>log4jConfigLocation</param-name><param-value>/WEB-INF/log4j.properties</param-value></context-param><listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener><!--(2)负责启动Spring容器的监听器,它将引用(1)处的上下文参数获得Spring配置文件的地址 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>
经验证,可以正确加载启动
如何在项目中使用Log4j 2
具体查看另外一篇博文 Spring-Spring Web项目中配置使用Log4j 2
使用JavaConfig(Java注解)的方式启动
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"version="3.0"><display-name>Archetype Created Web Application</display-name><!--通过指定context参数,让Spring使用AnnotationConfigWebApplicationContext而非XmlWebApplicationContext启动容器--><context-param><param-name>contextClass</param-name><param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value></context-param><!--指定标注了@Configuration的配置类,多个类,使用逗号或者空格分隔--><context-param> <param-name>contextConfigLocation</param-name> <param-value>com.xgj.AppConfig1,com.xgj.AppConfig2</param-value> </context-param> <!-- ContextLoaderListener监听器根据上面的配置使用AnnotationConfigWebApplicationContext根据contextConfigLocation指定的类启动Spring容器--><listener><listener-class>rg.springframework.web.context.ContextLoaderListener</listener-class></listener></web-app>
使用Groovy DSL配置Bean信息
web.xml 如下
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><!--通过指定context参数,让Spring使用GroovyWebApplicationContext而非XmlWebApplicationContext或AnnotationConfigWebApplicationContext启动容器 --><context-param><param-name>contextClass</param-name><param-value>org.springframework.web.context.support.GroovyWebApplicationContext</param-value></context-param><!-- 指定标注了Groovy的配置文件--><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:conf/spring-mvc.groovy</param-value></context-param><!-- ContextLoaderListener监听器将根据上面配置使用AnnotationConfigWebApplicationContext根据contextConfigLocation指定的配置类启动Spring容器--><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener></web-app>
spring-mvc.groovy
import org.hibernate.validator.HibernateValidator
import org.springframework.context.support.ReloadableResourceBundleMessageSource
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean
import org.springframework.web.servlet.i18n.CookieLocaleResolver
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor
import org.springframework.web.servlet.view.InternalResourceViewResolverbeans {xmlns context: "http://www.springframework.org/schema/context"xmlns mvc: "http://www.springframework.org/schema/mvc"context.'component-scan'('base-package': "com.smart")mvc.'annotation-driven'('validator': "validator")validator(LocalValidatorFactoryBean) {providerClass = HibernateValidator.classvalidationMessageSource = ref("messageSource")}messageSource(ReloadableResourceBundleMessageSource) {basenames = ["classpath:messages", "classpath:org/hibernate/validator/ValidationMessages"]defaultEncoding = "UTF-8"cacheSeconds = 60}viewResolver(InternalResourceViewResolver) {prefix = "/WEB-INF/jsp/"suffix = ".jsp"}mvc.interceptors() {localeChangeInterceptor(LocaleChangeInterceptor) {paramName = "language"}}cookieLocaleResolver(CookieLocaleResolver) {cookieName = "language"cookieMaxAge = "3600"defaultLocale = "zh_CN"}}
Spring-WebApplicationContext解读相关推荐
- Spring MVC 解读——context:component-scan/
2019独角兽企业重金招聘Python工程师标准>>> Spring MVC 解读---<context:component-scan/> 注解是骑士魂牵梦绕的美丽公主, ...
- Spring MVC 解读——@Autowired
2019独角兽企业重金招聘Python工程师标准>>> Spring MVC 解读--@Autowired 一.@Autowired 作为一个Spring开发者对@Autowired ...
- Spring MVC 解读——@Autowired、@Controller、@Service从原理层面来分析
Spring MVC 解读--@Autowired 一.@Autowired 作为一个Spring开发者对@Autowired注解必定是非常了解了, 顾名思义自动装配,应该是Spring会自动将我们标 ...
- Spring WebApplicationContext
WebApplicationContext是专门为web应用准备的,他允许从相对于web根目录的路劲中装载配置文件完成初始化工作,从WebApplicationContext中可以获得ServletC ...
- Spring MVC 解读——mvc:annotation-driven/
2019独角兽企业重金招聘Python工程师标准>>> 一.AnnotationDrivenBeanDefinitionParser 通常如果我们希望通过注解的方式来进行Spring ...
- 40 个 Spring Boot 常用注解
以下文章来源方志朋的博客,回复"666"获面试宝典 作者 | 谭朝红 链接 | ramostear.com 一.Spring Web MVC 与 Spring Bean 注解 Sp ...
- Spring restful
1. RESTful 不是一项技术,也不是一个标准,而是一种风格,跟servlet不在一个层面上,根本无法比较.一个基于servlet的application也是可以是符合RESTful风格的,换言之 ...
- 在Spring中使用Asciidoctor:使用Spring MVC渲染Asciidoc文档
Asciidoc是一种基于文本的文档格式,因此如果要将文档提交到版本控制系统中并跟踪不同版本之间的更改,它非常有用. 这使Asciidoc成为编写书籍,技术文档,常见问题解答或用户手册的理想工具. 创 ...
- 详解spring框架入门到精通
spring概述 spring框架的优点 spring框架的组成 spring核心IOC IOC概述 IOC入门案例 创建maven jar工程 引入spring的依赖 引入spring的核心配置文件 ...
- 6、Spring MVC 之 定义@RequestMapping处理方法
@RequestMapping处理器方法可以非常灵活的签名.支持的方法参数和返回值在以下部分中描述.大多数参数可用于任意顺序除了BindingResult这个唯一的参数例外.下一节中将会描述. not ...
最新文章
- 打开vs没有解决方案_汇编环境配置+简单示例(masm+VS+Win10)
- parquet to mysql_在hive中使用parquet (CDH4.3)
- C#中Json字符串的各种应用类
- poj2449(第k短路)
- 10.1-控制单元CU的组合逻辑设计
- w ndows 高级索引,软媒原创:为Windows7建立索引,搜索文件更给力
- Java练习:tips.Print
- ZeroMQ简介:一种高性能的异步消息传递库
- Windows下安装NTP时间同步服务器
- 共享打印机从网络访问此计算机,win7连接共享打印机时出现,你没有权限访问网络资源...
- 区块链共识问题都有什么?
- 简单理解Momentum,RMSprop,Adam优化算法
- 认识Hyperledger
- 华为手机android7价格,华为7怎么样?报价多少?
- MATLAB怎么新建头文件,头文件()包含了C++的MATLAB引擎函数的定义。
- html+php内联执行JavaScript是报错
- [COPY]《京东技术解密》——海量订单处理
- STM32 CAN笔记(一)
- 【数据挖掘】之 数据挖掘 绪论
- Paint in 3D 基本使用方法(Unity 3D)
热门文章
- Linux下CMake简明教程(七)对库进行链接
- pandas 提取股票价格
- 江西理工大学c语言程序设计,C语言程序设计
- 文巾解题 181. 超过经理收入的员工
- 算法解密:电梯是如何实现上下调度的?
- 万字长文,一文读懂Linux的常规操作(墙裂建议收藏)
- 深度学习核心技术精讲100篇(二十五)-58同城是如何构建智能化流量分发的?
- Flink从入门到精通100篇(三)-如何利用InfluxDB+Grafana搭建Flink on YARN作业监控大屏环境
- 压缩追踪Compressive Tracking源码理解
- 偏最小二乘法回归(Partial Least Squares Regression)