spring?mvc?AOP切面方法未執(zhí)行的一種情況的分析和處理過程
spring mvc AOP 在service里面,嵌套調(diào)用一個觸發(fā)切面方法,然而并沒有觸發(fā)切面方法執(zhí)行,但在controller里面直接調(diào)用這個方法,就可以觸發(fā)切面方法。
在springmvc里面,使用到AOP--面向切面編程,在切面做一些統(tǒng)一的事情。
遇到的情況是這樣的
1:在controller里面直接調(diào)用service里面的save方法,那么就會觸發(fā)切面的方法。
2:在controller里面調(diào)用service的其他方法,其他方法,最終會間接的調(diào)用這個save方法,這個時候,就不會觸發(fā)切面方法。
首先,上面的切面表達(dá)式是沒有問題的,肯定能切到對應(yīng)的方法的。
這個切面,就是去統(tǒng)一刷新一下緩存,所以,只需要在涉及到修改數(shù)據(jù)庫的時候,才需要執(zhí)行這個切面的方法。
如果,沒修改數(shù)據(jù)庫的話,就不需要去刷新緩存。就這么一個需求。
解決方法
原來的間接調(diào)用save方法,是如下樣式的。
因為這個save()方法就在同一個類里面所以,就可以直接調(diào)用,不嫌麻煩的,還可以在前面加個this。
這么使用的話,是不會觸發(fā)切面方法執(zhí)行的。
修改如下:
在service類里面,使用resource注解,把自己再給引入一下,然后使用他去調(diào)用目標(biāo)方法,觸發(fā)切面方法。
在自己的類里面,再把自己給引入進(jìn)來,在需要觸發(fā)切面方法的時候,就是這個selfService.目標(biāo)方法(),來觸發(fā)切面去執(zhí)行切面方法。
原理
看別人說這個使用ioc注入進(jìn)來的這個service已經(jīng)變成了一個代理啦,這個AOP的實現(xiàn)就是這個代理模式來實現(xiàn)的,你要是在類里面使用this來調(diào)用方法的話,就跟這個代理沒關(guān)系啦,切面的觸發(fā),都是service的對應(yīng)代理去觸發(fā)的,所以,你在service里面直接調(diào)用觸發(fā)切面的方法,是達(dá)不到這個效果的,所以,需要使用這個ioc注入的代理對象,就會觸發(fā)切面的方法啦。
看這個圖的執(zhí)行結(jié)果,可驗證如下幾個結(jié)論。
1,spring使用的aop是基于cglib來實現(xiàn)的。
2,交給IOC注入到容器的bean,我們使用的那個service是代理對象,不是原始對象。
注意
你這個不是在自己的類里面把自己又注入一次么。
所以,你在使用這個selfService的時候,小心點,避免陷入自己調(diào)用自己,然后,陷入無限循環(huán)的尷尬境地。
我想老鐵不應(yīng)該弄出這么簡單的bug吧。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
取消idea雙擊shift鍵時出現(xiàn)的全局搜索的問題分析
這篇文章主要介紹了取消idea雙擊shift鍵時出現(xiàn)的全局搜索的問題分析,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2023-10-10Spring?WebMVC初始化Controller流程詳解
這篇文章主要介紹了Spring?WebMVC初始化Controller流程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02springboot解決使用localhost或127.0.01模擬CORS失效
CORS允許不同源的網(wǎng)頁請求訪問另一個源服務(wù)器上的某些資源,本文主要介紹了springboot解決使用localhost或127.0.01模擬CORS失效,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07使用easyexcel導(dǎo)出的excel文件,使用poi讀取時異常處理方案
這篇文章主要介紹了使用easyexcel導(dǎo)出的excel文件,使用poi讀取時異常處理方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12mybatis實現(xiàn)獲取入?yún)⑹荓ist和Map的取值
這篇文章主要介紹了mybatis實現(xiàn)獲取入?yún)⑹荓ist和Map的取值問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06SpringBoot使用Quartz無法注入Bean的問題及解決
這篇文章主要介紹了SpringBoot使用Quartz無法注入Bean的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11