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

解决方案 »

  1.   

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

  2.   

    它文章解释原理很清晰,但是为什么我观察到的现象相反呢?service层里是取hibernatetemple来完成事务的,这时明显是父上下文在aop,但是service此时是在子上下文里,如果说父上下文不能访问子上下文,这个时候是怎么完成事务的
      

  3.   

    web.xml中.ContextLoaderListener是初始化父容器的,他会去初始化一个xmlwebapplicationcontext, 同时初始化他的配置文件,在配置文件中的bean,或者是annotation的bean,就放在这个context的beanfactory中。dispatcherservlet,会初始化一个子容器,他也会初始化他的配置文件,然后去初始化bean.父子关系是通过setParent确定。