关于spring,父上下文不能对子上下文进行AOP

J2EE 码拜 10年前 (2015-04-02) 924次浏览 0个评论
 

这是在别处看到关于spring mvc里的一段话。

引用

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

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

关于spring,父上下文不能对子上下文进行AOP
不懂
关于spring,父上下文不能对子上下文进行AOP
你后面发挥的和人家说的好像有很大的出入。
关于spring,父上下文不能对子上下文进行AOP
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);
关于spring,父上下文不能对子上下文进行AOP
你看的文章不是很好的解释了吗??我跟你看的是一样的博文
关于spring,父上下文不能对子上下文进行AOP
引用 4 楼 leighton11 的回复:

你看的文章不是很好的解释了吗??我跟你看的是一样的博文

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

关于spring,父上下文不能对子上下文进行AOP
10分
web.xml中.ContextLoaderListener是初始化父容器的,他会去初始化一个xmlwebapplicationcontext, 同时初始化他的配置文件,在配置文件中的bean,或者是annotation的bean,就放在这个context的beanfactory中。

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

父子关系是通过setParent确定。

关于spring,父上下文不能对子上下文进行AOP
我来说说自己的想法:
首先要确定的是,父上下文容器不能访问子上下文容器的内容,反过来就可以;同时父上下文容器内容可以调用父上下文容器的其他内容。

我再简单点看
1. 其实子上下文容器中定义的Action,就http请求通过过滤器找到的Controller类。
2. 父上下文容器中可以定义Service、BC、DAO这几个层。
3. 我们就应该通过Controller类 -》service -》BC -》DAO -》数据的增删改查,这样挺合理的对吧。
4. 放过来看看,DAO调用Controller类,明显是不合理的。
5. 同时,在BC层调用另一个Service,或BC层调另一个BC层,这样就等同于父容器的一个内容调父容器的另一个内容,这是没有问题的。

不知道能否解决你的问题。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于spring,父上下文不能对子上下文进行AOP
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!