日期:2014-05-18  浏览次数:20742 次

关于spring,什么叫做父上下文不能对子上下文进行AOP?
这是在别处看到关于spring mvc里的一段话。

引用
方案一,传统型:
父上下文容器中保存数据源、服务层、DAO层、事务的Bean。
子上下文容器中保存Mvc相关的Action的Bean.
事务控制在服务层。
由于父上下文容器不能访问子上下文容器中内容,事务的Bean在父上下文容器中,无法访问子上下文容器中内容,就无法对子上下文容器中Action进行AOP(事务)。
当然,做为“传统型”方案,也没有必要这要做。


我以前一直都是用struts2来实现mvc的,spring用listener来整合整个系统,在service层里访问dao来实现事务逻辑和数据库事务,从来也没意识到有个所谓的父子上下文,而且父上下文还不能对子上下文的数据进行访问的问题,按这个文章的说法,service这些难道不是在子上下文里,既然父上下文不能对子上下文完成事务,为什么我在service层里进行hibernatetemple的操作都成功了?完全无法理解这个说法

------解决方案--------------------
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);
------解决方案--------------------
web.xml中.ContextLoaderListener是初始化父容器的,他会去初始化一个xmlwebapplicationcontext, 同时初始化他的配置文件,在配置文件中的bean,或者是annotation的bean,就放在这个context的beanfactory中。

dispatcherservlet,会初始化一个子容器,他也会初始化他的配置文件,然后去初始化bean.

父子关系是通过setParent确定。