Spring父子上下文(WebApplicationContext)(防止事务失效)
如果你使用了listener监听器来加载配置,一般在Struts+Spring+Hibernate的项目中都是使用listener监听器的。如下
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
Spring会创建一个WebApplicationContext上下文,称为父上下文(父容器) ,保存在 ServletContext中,key是WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE的值。
可以使用Spring提供的工具类取出上下文对象:WebApplicationContextUtils.getWebApplicationContext(ServletContext);
DispatcherServlet是一个Servlet,可以同时配置多个,每个 DispatcherServlet有一个自己的上下文对象(WebApplicationContext),称为子上下文(子容器),子上下文可以访问父上下文中的内容,但父上下文不能访问子上下文中的内容。 它也保存在 ServletContext中,key是"org.springframework.web.servlet.FrameworkServlet.CONTEXT"+Servlet名称。当一个Request对象产生时,会把这个子上下文对象(WebApplicationContext)保存在Request对象中,key是DispatcherServlet.class.getName() + ".CONTEXT"。
可以使用工具类取出上下文对象:RequestContextUtils.getWebApplicationContext(request);
说明 :Spring 并没有限制我们,必须使用父子上下文。我们可以自己决定如何使用。
方案一,传统型:
父上下文容器中保存数据源、服务层、DAO层、事务的Bean。
子上下文容器中保存Mvc相关的Action的Bean.
事务控制在服务层。
由于父上下文容器不能访问子上下文容器中内容,事务的Bean在父上下文容器中,无法访问子上下文容器中内容,就无法对子上下文容器中Action进行AOP(事务)。
常用配置例如:
在主容器中(applicationContext.xml),将Controller的注解排除掉
<context:component-scan base-package="jcode"><context:exclude-filter type="annotation"expression="org.springframework.stereotype.Controller" /></context:component-scan>
而在springMVC配置文件中将Service注解给去掉
<context:component-scan base-package="jcode"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" /> </context:component-scan>
说明:因为spring的context是父子容器,所以会产生冲突,由ServletContextListener产生的是父容器,springMVC产生的是子容器,子容器Controller进行扫描装配时装配了@Service注解的实例,而该实例理应由父容器进行初始化以保证事务的增强处理,所以此时得到的将是原样的Service(没有经过事务加强处理,故而没有事务处理能力。
还有一种方式是将service层改用xml配置,其实这样做也是变相的让springmvc无法扫描service,而只能依赖父窗口也就是ServletContextListener来进行初始化,这样同样被赋予了事务性。
方案二,激进型:
Java世界的“面向接口编程”的思想是正确的,但在增删改查为主业务的系统里,Dao层接口,Dao层实现类,Service层接口,Service层实现类,Action父类,Action。再加上众多的O(vo\po\bo)和jsp页面。写一个小功能 7、8个类就写出来了。 开发者说我就是想接点私活儿,和PHP,ASP抢抢饭碗,但我又是Java程序员。最好的结果是大项目能做好,小项目能做快。所以“激进型”方案就出现了-----没有接口、没有Service层、还可以没有众多的O(vo\po\bo)。那没有Service层事务控制在哪一层?只好上升的Action层。
本文不想说这是不是正确的思想,我想说的是Spring不会限制你这样做。
由于有了父子上下文,你将无法实现这一目标。解决方案是只使用子上下文容器,不要父上下文容器 。所以数据源、服务层、DAO层、事务的Bean、Action的Bean都放在子上下文容器中。就可以实现了,事务(注解事务)就正常工作了。这样才够激进。
总结:不使用listener监听器来加载spring的配置文件,只使用DispatcherServlet来加载spring的配置,不要父子上下文,只使用一个DispatcherServlet,事情就简单了,什么麻烦事儿也没有了。
转载于:https://www.cnblogs.com/cxyj/p/3885390.html
Spring父子上下文(WebApplicationContext)(防止事务失效)相关推荐
- Spring父子上下文的使用案例
Spring父子上下文的使用案例 一.背景 二.需求 三.实现步骤 1.基础代码编写 2.测试结果 四.小彩蛋 五.完整代码 一.背景 最近在看在使用Spring Cloud的时候发现,当我们通过Fe ...
- 聊聊Spring事务失效的12种场景,太坑人了
前言 对于从事java开发工作的同学来说,spring的事务肯定再熟悉不过了. 在某些业务场景下,如果一个请求中,需要同时写入多张表的数据.为了保证操作的原子性(要么同时成功,要么同时失败),避免数据 ...
- 每日一博 - 常见的Spring事务失效事务不回滚案例集锦
文章目录 事务不生效 方法内部调用 修复方法一 : [新加一个Service方法] 修复方法二:[在该Service类中注入自己] 修复方法三:[通过AopContent类]<---- 推荐 访 ...
- 详解spring事务失效和回滚失败的场景
详解spring事务失效和回滚失败的场景 详解spring事务失效和回滚失败的场景 前言 一 .事务不生效 1.访问权限问题 2. 方法用final修饰 3.方法的内部调用 3.1 新加一个Servi ...
- Spring父子容器详解!!!!
访问规则:子容器可以访问父容器的对象,父容器不能访问子容器的对象 1.ContextLoaderListener会被优先初始化时,其会根据元素中contextConfigLocation参数指定的配置 ...
- springMVC重复扫描bean导致声明式事务失效
文章目录 1 配置文件 1.1 加载spring容器配置 1.2 加载springMvc容器配置 1.3 spring声明式事务配置 2 声明式事务失效 2.1 事务失效的原因 2.2 解决方案 3 ...
- Spring MVC上下文父子容器
2019独角兽企业重金招聘Python工程师标准>>> Spring MVC上下文父子容器 博客分类: java spring 在Spring MVC的启动依赖Spring框架,有时 ...
- 8个Spring事务失效的场景,你碰到过几种?
前言 作为Java开发工程师,相信大家对Spring种事务的使用并不陌生.但是你可能只是停留在基础的使用层面上,在遇到一些比较特殊的场景,事务可能没有生效,直接在生产上暴露了,这可能就会导致比较严重的 ...
- spring声明式事务 同一类内方法调用事务失效
一 宏观说明 [问题] Spring的声明式事务,我想就不用多介绍了吧,一句话"自从用了Spring AOP啊,事务管理真轻松啊,真轻松:事务管理代码没有了,脑不酸了,手不痛了,一口气全配上 ...
- Spring 事务失效?看这篇文章就够了!
欢迎关注方志朋的博客,回复"666"获面试宝典 用 Spring 的 @Transactional 注解控制事务有哪些不生效的场景? 不知道小伙伴们有没有这样的经历,在自己开心的编 ...
最新文章
- matlab编程选择语句,matlab编程控制语句
- 4、Power View—卡的应用
- Error: cmd: Command failed with exit code ENOENT
- 关于“无法完成该动作 到Microsoft Exchange的连接不可用”的解决办法
- C++ 11 深度学习(二) 命名空间简介、基本输入输出精解
- 判断微信小游戏用户是否真的分享
- web安全检查_如何利用现代Web检查器的功能
- css属性前浏览器厂商前缀
- java服务端异步处理机制_Java异步处理机制实例详解
- ip伪装服务器_亚马逊测评还能做吗亚马逊静态ip测评
- kube-proxy修改成ipvs模式
- Sklearn——用Sklearn实现线性回归(LinearRegression)
- 管理感悟:站在理的一边,不中立
- 嵩天python测验_北理 嵩天老师 Python程序设计 测验易错题总结
- matlab7.0官方下载64位win10,window10下MATLAB 7.0下载及安装
- java api 合数_如何在 Swift 语言下使用 iOS Charts API 制作漂亮图表?
- GitHub上史上最全的iOS开源项目分类汇总
- 利用计算机对人脸进行识别的应用领域是,计算机人脸识别技术及应用简析
- MATLAB画甘特图
- 编程范式(斯坦福大学)学习笔记《四》
热门文章
- 中职计算机专业学Excel,2013年中职计算机应用专业中文Excel电子表格处理实际操作练习.doc...
- python中的threading_python中threading的用法
- 提取寄生参数都有哪些流程_齿条齿轮参数都有哪些?
- Scala学习04——Scala方法与函数
- java 双冒号_Java 双冒号::是什么操作符?
- mysql5.6系列使用记录信息
- slf4j打印未捕获异常信息_谁再悄咪咪的吃掉异常,我上去就是一 JIO
- python笔记2-冒泡排序
- oracle学习-数据迁移
- MySQL 5.5/5.6——概述 MySQL 客户端程序