父子上下文(WebApplicationContext)

假设你使用了listener监听器来载入配置。一般在Struts+Spring+Hibernate的项目中都是使用listener监听器的。

例如以下

  1. <listener>
  2. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  3. </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(事务)。

当然。做为“传统型”方案。也没有必要这要做。

方案二,激进型:

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,事情就简单了,什么麻烦事儿也没有了。

Java--大项目能做好--按传统方式做,规规矩矩的做,好扩展,好维护。

Java--小项目能做快--按激进方式做。一周时间就能够出一个版本号。先上线接受市场(用户)的反馈。再改进。再反馈,时间就是生命(成本)。

转载请注明出处:原文地址:http://elf8848.iteye.com/blog/875830

最新文章

  1. React Native:使用 JavaScript 构建原生应用
  2. IOS6学习笔记(一)
  3. CentOS下netstat + awk 查看tcp的网络连接状态
  4. How to push your code in git
  5. hdu 3061 (最大权闭合图)
  6. oracle 计算两个时间之间的月份差,相差几个星期,相差多少天
  7. 多机并行计算框架 和CoolHash数据库(可用于多机机器学习)
  8. [Swift]LeetCode260. 只出现一次的数字 III | Single Number III
  9. JavaScript代码压缩工具UglifyJS和Google Closure Compiler的基本用法
  10. Problem C: STL——Jerry的问题
  11. 【转】iOS开发笔记--识别单击还是双击
  12. ext.net gridlist选择内部元素时自动选择所在行
  13. Instruments
  14. pycharm调整代码长度分割线
  15. LeetCode 806 Number of Lines To Write String 解题报告
  16. collections, time, queue的应用
  17. 通过PyPI镜像安装Python包
  18. UVa 1610 聚会游戏
  19. [PHP] ubuntu16.04配置Lamp环境(搭建linux+apache+mysql+php7环境)
  20. leetcode 20 括号匹配

热门文章

  1. SpringBoot学习笔记(10)-----SpringBoot中使用Redis/Mongodb和缓存Ehcache缓存和redis缓存
  2. jQuery第二课 点击弹出一个提示框
  3. nginx编译支持HTTP2.0
  4. visual studio 2015下python编程的中文字符串问题
  5. Inter-partition communication in multi-core processor
  6. Mybatis Generator for SQL Server
  7. hadoop-15-Ambari进行HDP、zookeeper安装
  8. HttpClient 图讲解明
  9. less11 属性合并
  10. [poj 2773] Happy 2006 解题报告 (二分答案+容斥原理)