如果你使用了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)(防止事务失效)相关推荐

  1. Spring父子上下文的使用案例

    Spring父子上下文的使用案例 一.背景 二.需求 三.实现步骤 1.基础代码编写 2.测试结果 四.小彩蛋 五.完整代码 一.背景 最近在看在使用Spring Cloud的时候发现,当我们通过Fe ...

  2. 聊聊Spring事务失效的12种场景,太坑人了

    前言 对于从事java开发工作的同学来说,spring的事务肯定再熟悉不过了. 在某些业务场景下,如果一个请求中,需要同时写入多张表的数据.为了保证操作的原子性(要么同时成功,要么同时失败),避免数据 ...

  3. 每日一博 - 常见的Spring事务失效事务不回滚案例集锦

    文章目录 事务不生效 方法内部调用 修复方法一 : [新加一个Service方法] 修复方法二:[在该Service类中注入自己] 修复方法三:[通过AopContent类]<---- 推荐 访 ...

  4. 详解spring事务失效和回滚失败的场景

    详解spring事务失效和回滚失败的场景 详解spring事务失效和回滚失败的场景 前言 一 .事务不生效 1.访问权限问题 2. 方法用final修饰 3.方法的内部调用 3.1 新加一个Servi ...

  5. Spring父子容器详解!!!!

    访问规则:子容器可以访问父容器的对象,父容器不能访问子容器的对象 1.ContextLoaderListener会被优先初始化时,其会根据元素中contextConfigLocation参数指定的配置 ...

  6. springMVC重复扫描bean导致声明式事务失效

    文章目录 1 配置文件 1.1 加载spring容器配置 1.2 加载springMvc容器配置 1.3 spring声明式事务配置 2 声明式事务失效 2.1 事务失效的原因 2.2 解决方案 3 ...

  7. Spring MVC上下文父子容器

    2019独角兽企业重金招聘Python工程师标准>>> Spring MVC上下文父子容器 博客分类: java spring 在Spring MVC的启动依赖Spring框架,有时 ...

  8. 8个Spring事务失效的场景,你碰到过几种?

    前言 作为Java开发工程师,相信大家对Spring种事务的使用并不陌生.但是你可能只是停留在基础的使用层面上,在遇到一些比较特殊的场景,事务可能没有生效,直接在生产上暴露了,这可能就会导致比较严重的 ...

  9. spring声明式事务 同一类内方法调用事务失效

    一 宏观说明 [问题] Spring的声明式事务,我想就不用多介绍了吧,一句话"自从用了Spring AOP啊,事务管理真轻松啊,真轻松:事务管理代码没有了,脑不酸了,手不痛了,一口气全配上 ...

  10. Spring 事务失效?看这篇文章就够了!

    欢迎关注方志朋的博客,回复"666"获面试宝典 用 Spring 的 @Transactional 注解控制事务有哪些不生效的场景? 不知道小伙伴们有没有这样的经历,在自己开心的编 ...

最新文章

  1. matlab编程选择语句,matlab编程控制语句
  2. 4、Power View—卡的应用
  3. Error: cmd: Command failed with exit code ENOENT
  4. 关于“无法完成该动作 到Microsoft Exchange的连接不可用”的解决办法
  5. C++ 11 深度学习(二) 命名空间简介、基本输入输出精解
  6. 判断微信小游戏用户是否真的分享
  7. web安全检查_如何利用现代Web检查器的功能
  8. css属性前浏览器厂商前缀
  9. java服务端异步处理机制_Java异步处理机制实例详解
  10. ip伪装服务器_亚马逊测评还能做吗亚马逊静态ip测评
  11. kube-proxy修改成ipvs模式
  12. Sklearn——用Sklearn实现线性回归(LinearRegression)
  13. 管理感悟:站在理的一边,不中立
  14. 嵩天python测验_北理 嵩天老师 Python程序设计 测验易错题总结
  15. matlab7.0官方下载64位win10,window10下MATLAB 7.0下载及安装
  16. java api 合数_如何在 Swift 语言下使用 iOS Charts API 制作漂亮图表?
  17. GitHub上史上最全的iOS开源项目分类汇总
  18. 利用计算机对人脸进行识别的应用领域是,计算机人脸识别技术及应用简析
  19. MATLAB画甘特图
  20. 编程范式(斯坦福大学)学习笔记《四》

热门文章

  1. 中职计算机专业学Excel,2013年中职计算机应用专业中文Excel电子表格处理实际操作练习.doc...
  2. python中的threading_python中threading的用法
  3. 提取寄生参数都有哪些流程_齿条齿轮参数都有哪些?
  4. Scala学习04——Scala方法与函数
  5. java 双冒号_Java 双冒号::是什么操作符?
  6. mysql5.6系列使用记录信息
  7. slf4j打印未捕获异常信息_谁再悄咪咪的吃掉异常,我上去就是一 JIO
  8. python笔记2-冒泡排序
  9. oracle学习-数据迁移
  10. MySQL 5.5/5.6——概述 MySQL 客户端程序