1. 程式人生 > >Spring AOP攔截對Controller的請求時的配置失敗

Spring AOP攔截對Controller的請求時的配置失敗

之前學了Spring AOP的內容,在普通的應用上使用是沒有問題的,後來由於做web程式,所以想用來攔截http的請求,以便記錄日誌,但是在配置過程當中,出現了錯誤,具體內容如下:

之前我們講到,要配置一個切面類,要把它放入IoC容器中,並且還要使用如下程式碼配置:

<aop:aspectj-autoproxy proxy-target-class="true"/>
但是用過Java Web開發應用的都知道,使用Spring時的配置檔案可能會有兩個(我是這麼做的),一個就是用在全域性範圍內的applicationContext.xml(配置檔案的名字可以改,我是按照預設的使用方式說明的),一個就是SpringMVC自己的配置檔案,我在配置的時候是把配置資訊放到了全域性的配置檔案中,發現切面怎麼也不起作用,因為之前的使用方式就是這樣的,後來在網上搜索,發現好多種說法,但是大家都預設,當攔截controller的方法時把配置資訊放到了springMVC的配置檔案中
了,但是沒說明這是為什麼,抱著一種不達目的不罷休的精神又在網上搜索,終於找到答案。下面我就把幾篇相關的文章貼出來,如果有和我相同問題的人,希望可以幫助到你。

相關文章:

下面我把最後一篇文章的解決方式引用過來,感謝這位朋友:

簡單的說,就是父子容器的問題,將AOP的配置資訊放在applicationContext.xml中,該配置檔案被ContextLoaderListener載入,Spring會建立一個WebApplicationContext的上下文,稱為父上下文(父容器),儲存在 ServletContext中,key值為WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE。而spring-mvc.xml是DispatcherServlet 的配置檔案,這樣的servlet可以同時配置多個,每個 DispatcherServlet有一個自己的上下文物件(WebApplicationContext),稱為子上下文(子容器),子上下文可以訪問父上下文中的內容,但父上下文不能訪問子上下文中的內容。 它也儲存在 ServletContext中, key值是"org.springframework.web.servlet.FrameworkServlet.CONTEXT"+Servlet名稱。當spring載入父容器的時候就會去找切入點,但是這個時候切入的controller是在子容器中的,父容器是無法訪問子容器,所以就攔截不到。