这是在别处看到关于spring mvc里的一段话。 我以前一直都是用struts2来实现mvc的,spring用listener来整合整个系统,在service层里访问dao来实现事务逻辑和数据库事务,从来也没意识到有个所谓的父子上下文,而且父上下文还不能对子上下文的数据进行访问的问题,按这个文章的说法,service这些难道不是在子上下文里,既然父上下文不能对子上下文完成事务,为什么我在service层里进行hibernatetemple的操作都成功了?完全无法理解这个说法 |
|
不懂
|
|
你后面发挥的和人家说的好像有很大的出入。
|
|
10分 |
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); |
你看的文章不是很好的解释了吗??我跟你看的是一样的博文
|
|
它文章解释原理很清晰,但是为什么我观察到的现象相反呢?service层里是取hibernatetemple来完成事务的,这时明显是父上下文在aop,但是service此时是在子上下文里,如果说父上下文不能访问子上下文,这个时候是怎么完成事务的 |
|
10分 |
web.xml中.ContextLoaderListener是初始化父容器的,他会去初始化一个xmlwebapplicationcontext, 同时初始化他的配置文件,在配置文件中的bean,或者是annotation的bean,就放在这个context的beanfactory中。
dispatcherservlet,会初始化一个子容器,他也会初始化他的配置文件,然后去初始化bean. 父子关系是通过setParent确定。 |
我来说说自己的想法:
首先要确定的是,父上下文容器不能访问子上下文容器的内容,反过来就可以;同时父上下文容器内容可以调用父上下文容器的其他内容。 我再简单点看 不知道能否解决你的问题。 |