最近在作项目时牵扯到有关父子上下文的概念。程序员
何为父子上下文呢?web
父上下文:spring
使用listener监听器来加载配置文件,以下:编程
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
Spring 会建立一个WebApplicationContext上下文,称为父上下文(父容器),保存在 ServletContext中,key是WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE的值。mvc
能够使用Spring提供的工具类取出上下文对象:WebApplicationContextUtils.getWebApplicationContext(ServletContext);app
子上下文:jsp
使用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"。url
能够使用工具类取出上下文对象:RequestContextUtils.getWebApplicationContext(request);spa
父上下文(父容器)和子上下文(子容器)的访问权限:
子上下文能够访问父上下文中的bean,可是父上下文不能够访问子上下文中的bean。
父上下文使用与否
方案一,传统型:
父上下文容器中保存数据源、服务层、DAO层、事务的Bean。
子上下文容器中保存Mvc相关的Action的Bean.
事务控制在服务层。
因为父上下文容器不能访问子上下文容器中内容,事务的Bean在父上下文容器中,没法访问子上下文容器中内容,就没法对子上下文容器中Action进行AOP(事务)。
固然,作为“传统型”方案,也没有必要这要作。
方案二,激进型:
Java世界的“面向接口编程”的思想是正确的,但在增删改查为主业务的系统里,Dao层接口,Dao层实现类,Service层接口,Service层实现类,Action父类,Action。再加上众多的O(vo\po\bo)和jsp页面。写一个小功能 七、8个类就写出来了。 开发者说我就是想接点私活儿,和PHP,ASP抢抢饭碗,但我又是Java程序员。最好的结果是大项目能作好,小项目能作快。因此“激进型”方案就出现了-----没有接口、没有Service层、还能够没有众多的O(vo\po\bo)。那没有Service层事务控制在哪一层?只好上升的Action层。
本文不想说这是否是正确的思想,我想说的是Spring不会限制你这样作。
因为有了父子上下文,你将没法实现这一目标。解决方案是只使用子上下文容器,不要父上下文容器 。因此数据源、服务层、DAO层、事务的Bean、Action的Bean都放在子上下文容器中。就能够实现了,事务(注解事务)就正常工做了。这样才够激进。
总结:不使用listener监听器来加载spring的配置文件,只使用DispatcherServlet来加载spring的配置,不要父子上下文,只使用一个DispatcherServlet,事情就简单了,什么麻烦事儿也没有了。
Java--大项目能作好--按传统方式作,规规矩矩的作,好扩展,好维护。
Java--小项目能作快--按激进方式作,一周时间就能够出一个版本,先上线接受市场(用户)的反馈,再改进,再反馈,时间就是生命(成本)。