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