为什么80%的码农都做不了架构师?>>>   

最近在做项目时牵扯到有关父子上下文的概念。

何为父子上下文呢?

父上下文:

使用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);

子上下文:

使用Spring MVC 来处理拦截相关的请求时,会配置DispatchServlet:

<servlet><servlet-name>dispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/applicationContext-mvc.xml</param-value></init-param><load-on-startup>1</load-on-startup>
</servlet><servlet-mapping><servlet-name>dispatcherServlet</servlet-name><url-pattern>/</url-pattern>
</servlet-mapping>

每个DispatchServlet会有一个自己的上下文,称为子上下文,它也保存在 ServletContext中,key 是"org.springframework.web.servlet.FrameworkServlet.CONTEXT"+Servlet名称。当一 个Request对象产生时,会把这个子上下文对象(WebApplicationContext)保存在Request对象中,key是 DispatcherServlet.class.getName() + ".CONTEXT"。

可以使用工具类取出上下文对象:RequestContextUtils.getWebApplicationContext(request);

父上下文(父容器)和子上下文(子容器)的访问权限:

子上下文可以访问父上下文中的bean,但是父上下文不可以访问子上下文中的bean。

父上下文使用与否

方案一,传统型:

父上下文容器中保存数据源、服务层、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--小项目能做快--按激进方式做,一周时间就可以出一个版本,先上线接受市场(用户)的反馈,再改进,再反馈,时间就是生命(成本)。

转载于:https://my.oschina.net/jast90/blog/282773

Spring 容器(Spring 的上下文)相关推荐

  1. 彻底理解 Spring 容器和应用上下文

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:收藏了!7 个开源的 Spring Boot 前后端分离优质项目个人原创+1博客:点击前往,查看更多 作者:陈本 ...

  2. Spring基础篇——Spring容器和应用上下文理解

    转载自 https://www.cnblogs.com/chenbenbuyi/p/8166304.html 上文说到,有了Spring之后,通过依赖注入的方式,我们的业务代码不用自己管理关联对象的生 ...

  3. spring 上下文_一次性教你彻底理解 Spring容器和应用上下文!

    作者:陈本布衣 www.cnblogs.com/chenbenbuyi 有了Spring之后,通过依赖注入的方式,我们的业务代码不用自己管理关联对象的生命周期.业务代码只需要按照业务本身的流程,走啊走 ...

  4. Spring容器与上下文理解

    2019独角兽企业重金招聘Python工程师标准>>> 转自:https://www.cnblogs.com/chenbenbuyi/p/8166304.html 个人感觉介绍的很不 ...

  5. Spring 读书笔记-----使用Spring容器(一)

    Spring有两个核心接口:BeanFactory和ApplicationContext,其中ApplicationContext是BeanFactory的子接口.他们都可代表Spring容器,Spr ...

  6. Spring实战 | 番外篇: 搭建Spring环境实现helloworld、Bean配置、Spring容器

    一.IntelliJ IDEA搭建Spring环境,实现helloworld 二.spring简介 三.配置形式 四.bean的配置方式 五.IOC和DI 六.在Spring的IOC容器里配置bean ...

  7. 五分钟,手撸一个Spring容器!

    Spring是我们最常用的开源框架,经过多年发展,Spring已经发展成枝繁叶茂的大树,让我们难以窥其全貌. 这节,我们回归Spring的本质,五分钟手撸一个Spring容器,揭开Spring神秘的面 ...

  8. 请简述什么是spring的ioc和di_小编Spring是什么、spring容器、IOC和DI

    1.Spring (1)Spring是什么? 是一个轻量级的.用来简化企业级应用开发的开发框架. 注: a.简化开发: Spring对常用的api做了简化,比如,使用Spring jdbc来访问数据库 ...

  9. 五分钟,手撸一个Spring容器

    大家好,我是老三,Spring是我们最常用的开源框架,经过多年发展,Spring已经发展成枝繁叶茂的大树,让我们难以窥其全貌. 这节,我们回归Spring的本质,五分钟手撸一个Spring容器,揭开S ...

  10. 《深入浅出Spring》Spring注解@Conditional

    @Conditional注解 @Conditional注解是从spring4.0才有的,可以用在任何类型或者方法上面,通过@Conditional注解可以配置一些条件判断,当所有条件都满足的时候,被@ ...

最新文章

  1. 白盒测试之语句分支条件覆盖
  2. mysql数据库什么是事件_MySQL数据库之mysql 事件(Event) 总结
  3. DotNet指定文件显示的尺寸
  4. Hive--优化参数
  5. 今天是个特殊的一天,有意义的一天,值得纪念的一天~
  6. LeetCode 1465. 切割后面积最大的蛋糕
  7. OSTU大律法二值化原理
  8. 为什么说没有物联网,就没有 AI ?
  9. ig 焊接机器人_发那科机器人焊接应用的IO配置(总线型)
  10. wpf 深度复制控件,打印控件
  11. SpringMVC单文件上传、多文件上传、文件列表显示、文件下载
  12. multicast unicast broadcast
  13. @所有人 尊贵的所有微信用户,现邀您开通VIP会员等级功能!
  14. C22-利用泰勒公式求sin(x)的值
  15. 情人节这些智能设备可千万别送女友
  16. Photoshop如何使用图像调色之实例演示?
  17. 任务管理器 中mysqld.exe 所占内存过高
  18. 「 LaTex 」写论文,作者旁添加ORCID
  19. x射线mas_X射线视觉
  20. 实现页面头的选择效果(自用)

热门文章

  1. 关于mysql的cpu占用高的问题
  2. lua的VS或者VC环境的搭建调试
  3. 解决Github图片加载失败
  4. codeforces 263A-C语言解题报告
  5. Install OpenCL on Debian, Ubuntu and Mint orderly
  6. 即时通讯开发(逐行、隔行扫描)
  7. gcc中的内嵌汇编语言(Intel i386平台)
  8. 视频中场的问题2009-04-03 19:38(一)
  9. 解决:single failed: For artifact {null:null:null:jar}: The groupId cannot be empty. 把工程依赖的jar包打到入jar中
  10. 7.11牛客题(指针)