Posted on 2010-01-27 23:53
leekiang 閱讀(3329)
評論(1) 編輯 收藏 所屬分類:
spring
我最近在開發(fā)一個使用Spring MVC的Web程序時遇到了一個奇怪的問題:自己寫的Spring AOP切面對Controller中的方法切點不起作用。
后來我查了一下,Spring對自己的MVC(Controller)有特殊的攔截方法,需要在URLHandlerMapping中配置
Interceptor實現(xiàn),它可以對請求進行攔截。因此直接用Spring
AOP切面攔截Controller中的任何方法都是不起作用的。(具體的實現(xiàn)過程我不是很清楚,但是很多文章和貼子表達的意思是這樣的)
后來,我做了一個實驗。通過IOC將一個業(yè)務(wù)對象注入Controller中,然后將AOP配置成作用于該業(yè)務(wù)對象的方法上,結(jié)果還是不起作用。
我?guī)缀踉囼灹怂械腟pring
AOP和AspectJ的實現(xiàn)和配置方法,都不起作用。后來我用同樣的類方法和同樣的配置方式,寫了一個脫離了Spring
MVC的測試程序,一切正常,切面能夠起到作用。
如果說Spring AOP對Spring MVC的Controller的方法不起作用,難道對注入到Controller的類方法也不起作用嗎???我想得到一個準確的答案,謝謝!??! (bryantd)
我對Spring的MVC并不是很熟,不過剛才仔細看了一下源碼,我覺得應(yīng)該之所以Spring的AOP沒有對Controller應(yīng)用成功的原因
是:Spring
MVC在啟動的時候會根據(jù)處理器策略加載handler映射到一個map中,這個時候因為配置的原因它從容器中取到的對象是原生對象,而不是我們代理的對
象;所以不管我們的Controller做了什么操作都不會經(jīng)過我們的代理,這樣AOP就失去了作用;獲取handler的方法應(yīng)該是
DefaultListableBeanFactory的getBeanNamesForType方法;這是我自己在查看源碼后總結(jié)出來的,如果有什么不
對的地方大家討論下? (layer555)
轉(zhuǎn)自http://www.javaeye.com/problems/20363