MDA/MDD/TDD/DDD/DDDDDDD
posts - 536, comments - 111, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Spring AOP应该用到Spring MVC上不起作用?

Posted on 2010-01-27 23:53 leekiang 阅读(3319) 评论(1)  编辑  收藏 所属分类: spring
我最近在开发一个使用Spring MVC的Web程序时遇到了一个奇怪的问题:自己写的Spring AOP切面对Controller中的方法切点不起作用。

后来我查了一下,Spring对自己的MVC(Controller)有特殊的拦截方法,需要在URLHandlerMapping中配置 Interceptor实现,它可以对请求进行拦截。因此直接用Spring AOP切面拦截Controller中的任何方法都是不起作用的。(具体的实现过程我不是很清楚,但是很多文章和贴子表达的意思是这样的)

后来,我做了一个实验。通过IOC将一个业务对象注入Controller中,然后将AOP配置成作用于该业务对象的方法上,结果还是不起作用。 我几乎试验了所有的Spring AOP和AspectJ的实现和配置方法,都不起作用。后来我用同样的类方法和同样的配置方式,写了一个脱离了Spring MVC的测试程序,一切正常,切面能够起到作用。

如果说Spring AOP对Spring MVC的Controller的方法不起作用,难道对注入到Controller的类方法也不起作用吗???我想得到一个准确的答案,谢谢!!! (bryantd)

我对Spring的MVC并不是很熟,不过刚才仔细看了一下源码,我觉得应该之所以Spring的AOP没有对Controller应用成功的原因 是:Spring MVC在启动的时候会根据处理器策略加载handler映射到一个map中,这个时候因为配置的原因它从容器中取到的对象是原生对象,而不是我们代理的对 象;所以不管我们的Controller做了什么操作都不会经过我们的代理,这样AOP就失去了作用;获取handler的方法应该是 DefaultListableBeanFactory的getBeanNamesForType方法;这是我自己在查看源码后总结出来的,如果有什么不 对的地方大家讨论下  (layer555)

转自http://www.javaeye.com/problems/20363

评论

# re: Spring AOP应该用到Spring MVC上不起作用?  回复  更多评论   

2011-11-29 12:04 by niuxiaohao
经试验,确实在spring control上aop不起作用,但是通过IOC将一个业务对象注入Controller中,AOP作用于该业务对象,是可以的

只有注册用户登录后才能发表评论。


网站导航: