博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring 容器(Spring 的上下文)
阅读量:6718 次
发布时间:2019-06-25

本文共 2092 字,大约阅读时间需要 6 分钟。

  hot3.png

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

何为父子上下文呢?

父上下文:

使用listener监听器来加载配置文件,如下:

     
org.springframework.web.context.ContextLoaderListener
   

Spring 会创建一个WebApplicationContext上下文,称为父上下文(父容器),保存在 ServletContext中,key是WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE的值。

可以使用Spring提供的工具类取出上下文对象:WebApplicationContextUtils.getWebApplicationContext(ServletContext);

子上下文:

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

    
dispatcherServlet
    
org.springframework.web.servlet.DispatcherServlet    
    
        
contextConfigLocation
        
/WEB-INF/applicationContext-mvc.xml
    
    
1
    
dispatcherServlet
    
/

每个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

你可能感兴趣的文章
Makefile生成器,使用C++和Boost实现
查看>>
ITOO之底层关系
查看>>
算法笔记_141:无向图的欧拉回路判断问题(Java)
查看>>
XX年年终总结---重新飞跃
查看>>
js---06函数传参数
查看>>
WCF系列教程之WCF服务配置
查看>>
Makefile 11——支持头文件目录指定
查看>>
解决JsonFormat日期少一天问题
查看>>
POJ 1201 Intervals
查看>>
[转]如何在 .Net Framework 4.0 项目上使用 OData?
查看>>
UVa 12279 - Emoogle Balance
查看>>
头文件algorithm中的常用函数
查看>>
一套解决方案,多个项目
查看>>
Qt3D Shader
查看>>
Android requires compiler compliance level 5.0 or 6.0. Found '1.4' instead的解决的方法
查看>>
dede文章插入分页符不起作用,编辑器中出现分页符,导致文章显示不全
查看>>
【POJ3377】Ferry Lanes 最短路
查看>>
zoj 1655 单源最短路 改为比例+最长路
查看>>
javascript--- HTML DOM
查看>>
Exactly-once Spark Streaming from Apache Kafka
查看>>