|
我最近在开发一个使用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 [url=]niuxiaohao[/url]
经试验,确实在spring control上aop不起作用,但是通过IOC将一个业务对象注入Controller中,AOP作用于该业务对象,是可以的
|
|