精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一個Spring AOP的坑!很多人都犯過!

開發 開發工具
很多讀者看完之后表示用起來很爽,但是后臺也有人留言說自己配置了Spring的AOP之后,發現切面不生效。其實,這個問題我在用的過程中也遇到過,而且還是同一個問題一天之內遇到了兩次。

 [[352384]]

前幾天,我剛剛發布過一篇文章《自定義注解!絕對是程序員裝逼的利器!!》,介紹過如何使用Spring AOP + 自定義注解來提升代碼的優雅性。

很多讀者看完之后表示用起來很爽,但是后臺也有人留言說自己配置了Spring的AOP之后,發現切面不生效。

其實,這個問題我在用的過程中也遇到過,而且還是同一個問題一天之內遇到了兩次。

說明這個問題很容易被忽略,并且這個問題帶來的后果可能是極其嚴重的。那么,我們就來簡單回顧一下問題是怎么樣的。

問題重現

最初我定義了一個注解,希望可以方便統一的對一些數據庫操作做緩存。于是就有了以下代碼:

首先,定義一個注解:

  1. @Target(ElementType.METHOD) 
  2.  
  3. @Retention(RetentionPolicy.RUNTIME) 
  4.  
  5. public @interface Cacheable { 
  6.  
  7.     /** 
  8.  
  9.      * 策略名稱,需要保證唯一 
  10.  
  11.      * @return 
  12.  
  13.      */ 
  14.  
  15.     public String keyName(); 
  16.  
  17.     /** 
  18.  
  19.      * 超時時長,單位:秒 
  20.  
  21.      * @return 
  22.  
  23.      */ 
  24.  
  25.     public int expireTime(); 
  26.  

然后自定義一個切面,對所有使用了該注解的方法進行切面處理:

  1. @Aspect 
  2.  
  3. @Component 
  4.  
  5. public class StrategyCacheAspect { 
  6.  
  7.     private static final Logger LOGGER = LoggerFactory.getLogger(FacadeAspect.class); 
  8.  
  9.     @Around("@annotation(com.hollis.cache.StrategyCache)"
  10.  
  11.     public Object cache(ProceedingJoinPoint pjp) throws Throwable { 
  12.  
  13.         // 先查緩存,如果緩存中有值,直接返回。如果緩存中沒有,先執行方法,再將返回值存儲到緩存中。 
  14.  
  15.     } 
  16.  

然后就可以使用該注解了,使用方法如下:

  1. @Component 
  2.  
  3. public class StrategyService extends BaseStrategyService  { 
  4.  
  5.     public PricingResponse getFactor(Map<String, String> pricingParams) { 
  6.  
  7.         // 做一些參數校驗,以及異常捕獲相關的事情 
  8.  
  9.         return this.loadFactor(tieredPricingParams); 
  10.  
  11.     } 
  12.  
  13.     @Override 
  14.  
  15.     @StrategyCache(keyName = "key0001", expireTime = 60 * 60 * 2) 
  16.  
  17.     private PricingResponse loadFactor(Map<String, String> pricingParams) { 
  18.  
  19.         //代碼執行 
  20.  
  21.     } 
  22.  

以上,對loadFactor方法增加了切面,為了方便使用,我們還定義了一個getFactor方法,設置為public,方便外部調用。

但是,在調試過程中,我發現我們設置在loadFactor方法上面的切面并沒有成功,無法執行切面類。

于是開始排查問題具體是什么。

問題排查

為了排查這個問題,首先是把所有的代碼檢查一遍,看看切面的代碼是不是有問題,有沒有可能有手誤打錯了字之類的。

但是發現都沒有。于是就想辦法找找問題。

接下來我把loadFactor的訪問權限從private改成public,發現沒有效果。

然后我嘗試著在方法外直接調用loadFactor而不是getFactor。

發現這樣做就可以成功的執行到切面里面了。

發現這一現象的時候,我突然恍然大悟,直捶大腿。原來如此,原來如此,就應該是這樣的。

我突然就想到了問題的原因。其實原因挺簡單的,也是我之前了解到過的原理,但是在問題剛剛發生的時候我并沒有想到這里,而是通過debug,發現這個現象之后我才突然想到這個原理。

那么,就來說說為什么會發生這樣的問題。

代理的調用方式

我們發現上面的問題關鍵在于loadFactor方法被調用的方式不同。我們知道,方法的調用通常有以下幾種方式:

1、在類內部,通過this進行自調用:

  1. public class SimplePojo implements Pojo { 
  2.  
  3.     public void foo() { 
  4.  
  5.         // this next method invocation is a direct call on the 'this' reference 
  6.  
  7.         this.bar(); 
  8.  
  9.     } 
  10.  
  11.     public void bar() { 
  12.  
  13.         // some logic... 
  14.  
  15.     } 
  16.  

2、在類外部,通過該類的對象進行調用

  1. public class Main { 
  2.  
  3.     public static void main(String[] args) { 
  4.  
  5.         Pojo pojo = new SimplePojo(); 
  6.  
  7.         // this is a direct method call on the 'pojo' reference 
  8.  
  9.         pojo.foo(); 
  10.  
  11.     } 
  12.  

類關系及調用過程中如下圖:

如果是靜態方法,也可以通過類直接調用。

3、在類外部,通過該類的代理對象進行調用:

  1. public class Main { 
  2.  
  3.     public static void main(String[] args) { 
  4.  
  5.         ProxyFactory factory = new ProxyFactory(new SimplePojo()); 
  6.  
  7.         factory.addInterface(Pojo.class); 
  8.  
  9.         factory.addAdvice(new RetryAdvice()); 
  10.  
  11.         Pojo pojo = (Pojo) factory.getProxy(); 
  12.  
  13.         // this is a method call on the proxy! 
  14.  
  15.         pojo.foo(); 
  16.  
  17.     } 
  18.  

類關系及調用過程中如下圖:

那么,Spring的AOP其實是第三種調用方式,就是通過代理對象調用,只有這種調用方式,才能夠在真正的對象的執行前后,能夠讓代理對象也執行相關代碼,才能起到切面的作用。

而對于使用this的方式調用,這種只是自調用,并不會使用代理對象進行調用,也就無法執行切面類。

問題解決

那么,我們知道了,想要真正的執行代理,那么就需要通過代理對象進行調用而不是使用this調用的方式。

那么,這個問題的解決辦法也就是想辦法通過代理對象來調用目標方法即可。

這種問題的解決網上有很多種辦法,這里介紹一個相對簡單的。其他的更多的辦法大家可以在網上找到一些案例。搜索關鍵詞"AOP 自調用"即可。

獲取代理對象進行調用

我們需要修改一下前面的StrategyService的代碼,修改成以下內容:

  1. @Component 
  2.  
  3. public class StrategyService{ 
  4.  
  5.     public PricingResponse getFactor(Map<String, String> pricingParams) { 
  6.  
  7.         // 做一些參數校驗,以及異常捕獲相關的事情 
  8.  
  9.         // 這里不使用this.loadFactor而是使用AopContext.currentProxy()調用,目的是解決AOP代理不支持方法自調用的問題 
  10.  
  11.         if (AopContext.currentProxy() instanceof StrategyService) { 
  12.  
  13.             return ((StrategyService)AopContext.currentProxy()).loadFactor(tieredPricingParams); 
  14.  
  15.         } else { 
  16.  
  17.             // 部分實現沒有被代理過,則直接進行自調用即可 
  18.  
  19.             return loadFactor(tieredPricingParams); 
  20.  
  21.         } 
  22.  
  23.     } 
  24.  
  25.     @Override 
  26.  
  27.     @StrategyCache(keyName = "key0001", expireTime = 60 * 60 * 2) 
  28.  
  29.     private PricingResponse loadFactor(Map<String, String> oricingParams) { 
  30.  
  31.         //代碼執行 
  32.  
  33.     } 
  34.  

即使用AopContext.currentProxy()獲取到代理對象,然后通過代理對象調用對應的方法。

還有個地方需要注意,以上方式還需要將Aspect的expose-proxy設置成true。如果是配置

文件修改:

  1. <aop:aspectj-autoproxy proxy-target-class="true" expose-proxy="true"/> 

如果是SpringBoot,則修改應用啟動入口類的注解:

  1. @EnableAspectJAutoProxy(exposeProxy = true
  2.  
  3. public class Application { 
  4.  

總結

以上,我們分析并解決了一個Spring AOP不支持方法自調用的問題。

AOP失敗這個問題,其實還是很嚴重的,因為如果發生非預期的失效,那么直接問題就是沒有執行切面方法,更嚴重的后果可能是諸如事務未生效、日志未打印、緩存未查詢等各種問題。

所以,還是建議大家看完此文之后,統查一下自己的代碼,是否存在方法自調用的情況。這種情況下,任何切面都是無法生效的!

【本文是51CTO專欄作者Hollis的原創文章,作者微信公眾號Hollis(ID:hollischuang)】

戳這里,看該作者更多好文

 

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2020-02-28 10:10:07

開源技術 工具

2021-04-04 23:19:37

5G4G技術

2017-12-04 01:08:15

戴爾

2019-08-08 16:00:08

HTTPGETPOST

2014-05-09 15:29:21

2020-07-14 08:43:54

VueHTML函數

2020-06-04 18:34:15

路由器耗電硬件

2024-09-05 09:30:51

FunctionJava8接口

2025-08-08 04:00:00

Java8接口函數式

2024-08-19 02:00:00

FunctionJava8接口

2024-09-12 08:32:42

2021-01-30 11:42:53

迭代器代碼元素

2025-02-21 08:48:16

Typescript內置聯合類型

2022-12-05 15:23:33

JavaScript技巧運算符

2025-06-13 10:14:55

2018-02-13 14:48:17

戴爾

2022-02-06 00:07:19

互聯網失業職業

2021-10-08 15:50:14

手機屏幕安卓

2017-12-13 15:57:12

2022-07-06 10:33:39

技術債務CIO
點贊
收藏

51CTO技術棧公眾號

精品日韩视频| 日本中文字幕电影在线观看 | 久久久精品网| 一区二区在线视频| 亚洲a级黄色片| sis001亚洲原创区| 欧美国产综合一区二区| 91中文字幕一区| 日韩精品1区2区| 99精品视频精品精品视频| 精品美女被调教视频大全网站| 男女激情无遮挡| 999国产在线视频| 不卡欧美aaaaa| 国产精品精品视频| 国产一级在线视频| 欧美jizz| 亚洲欧美中文日韩v在线观看| 极品粉嫩美女露脸啪啪| 深夜福利视频一区二区| 亚洲欧美国产三级| 日韩一本精品| 囯产精品一品二区三区| 日本伊人精品一区二区三区观看方式| 欧美国产日韩免费| 亚洲色图27p| 亚洲调教一区| 亚洲成人精品在线| 一区二区三区 欧美| 欧美日韩国产观看视频| 亚洲精品免费一二三区| 亚洲午夜精品国产| 成人全视频高清免费观看| av网站免费线看精品| 亚洲xxxxx性| 一二三四区在线| 亚洲欧美日韩专区| 高清欧美一区二区三区| 超碰人人干人人| 久久综合欧美| 精品亚洲国产视频| 免费啪视频在线观看| 日韩一区二区三免费高清在线观看| 欧美日韩中文在线| r级无码视频在线观看| 超碰在线免费播放| 亚洲婷婷综合久久一本伊一区| 日韩精品一区二区三区外面| 日韩在线无毛| 91网址在线看| 国产一区在线观| 日韩性xxxx| av电影天堂一区二区在线| 99久久99久久| 女人18毛片水真多18精品| 国产mv日韩mv欧美| http;//www.99re视频| 精品人妻无码一区二区| 国产另类ts人妖一区二区| 亚洲已满18点击进入在线看片| 国产露脸91国语对白| 久久99国产精品麻豆| 国产精品亚洲精品| 亚洲一线在线观看| 国产在线国偷精品免费看| 91在线视频精品| 成人乱码一区二区三区| 成a人片亚洲日本久久| 精品999在线观看| 手机亚洲第一页| 国产午夜精品久久| 亚洲激情一区二区三区| 日本暖暖在线视频| 亚洲免费观看高清完整版在线观看熊 | 亚洲日本香蕉视频| 久久综合九色欧美综合狠狠| 欧洲一区二区在线观看| 色欧美激情视频在线| 亚洲视频一区二区在线| 香港三级日本三级a视频| cao在线视频| 欧美影院一区二区| 91丝袜超薄交口足| 国产无遮挡裸体免费久久| 精品在线欧美视频| 久久av红桃一区二区禁漫| 牛牛国产精品| 欧洲成人午夜免费大片| 在线观看国产区| 国产乱子轮精品视频| 韩国一区二区三区美女美女秀| 精品电影在线| 亚洲视频一区在线观看| 精品久久一二三| 亚洲精品伊人| 精品伊人久久97| 手机在线免费看毛片| 国产精品老牛| 成人网在线免费看| 色视频在线观看| 亚洲欧美日韩中文字幕一区二区三区 | 国产小视频在线观看| 亚洲女同一区二区| 六月丁香婷婷在线| 免费观看亚洲视频大全| 亚洲欧美制服综合另类| 久久99久久久| 美女视频一区在线观看| 精品日本一区二区| av香蕉成人| 欧美视频在线不卡| 亚洲第一黄色网址| 午夜精品电影| 国产精品爽黄69天堂a| 神马一区二区三区| 一区二区高清在线| 福利视频999| 国产伦一区二区三区| 久久久影视精品| 国产日韩在线观看一区| 亚洲国产精品精华液ab| 国产精品欧美激情在线观看| gogo人体一区| 欧美xxxx做受欧美.88| 亚洲午夜无码久久久久| 91视频.com| 99热这里只有精品免费| 曰本一区二区| 色悠悠久久久久| 亚洲欧美一二三区| 久久精品夜色噜噜亚洲a∨| 很污的网站在线观看| 国产欧美88| www.欧美免费| 亚洲一卡二卡在线| 国产欧美日韩久久| 少妇高清精品毛片在线视频| 久久a爱视频| 国外成人免费在线播放| 午夜免费福利视频| 日韩欧美伦理| 91丝袜美腿高跟国产极品老师| 一区二区三区av| 免费在线成人激情电影| 亚洲天堂2020| 成人免费毛片男人用品| www激情久久| 国语对白做受xxxxx在线中国 | 欧美一区二区三区成人久久片| www.综合| 精品一区电影国产| 潘金莲一级淫片aaaaaa播放| 26uuu亚洲综合色| 久久久久久久久久久福利| 亚洲精品一级二级三级| 欧美一区二三区| 久久久久久久久亚洲精品| 欧美日韩在线看| 国产成人福利在线| 免费av成人在线| 91免费网站视频| 日韩激情欧美| 国内精品免费午夜毛片| 色视频在线观看福利| 色婷婷综合久久久久中文一区二区 | 91成人噜噜噜在线播放| 久久久亚洲国产| 精品影院一区| 欧美日韩高清在线播放| a级片在线观看免费| 成人国产在线观看| 免费黄色特级片| 水蜜桃精品av一区二区| 91中文字精品一区二区| 国产剧情av在线播放| 亚洲欧美日韩一区二区在线 | 欧美一区二区三区精美影视| 欧洲午夜精品| 欧美激情第一页xxx| 日本一本草久在线中文| 欧美日韩一区二区三区视频| 手机在线免费看毛片| 99re成人精品视频| 欧美激情成人网| 欧美精品三区| 精品蜜桃传媒| 婷婷成人av| 午夜欧美不卡精品aaaaa| 久草在现在线| 日韩精品一区在线观看| 无码人妻熟妇av又粗又大| 一区二区中文视频| 午夜一区二区三区免费| 久久综合综合久久综合| 国产中文字幕二区| 日本久久黄色| 精品欧美日韩| 精品一区二区三区中文字幕视频 | 国产91色综合久久免费分享| 情侣黄网站免费看| 欧美日韩理论| 亚洲日本精品国产第一区| 国产成人澳门| 亚洲综合在线播放| av免费在线一区| 久久久之久亚州精品露出| 日本在线免费中文字幕| 亚洲精品自产拍| 性一交一乱一伧老太| 欧美色男人天堂| 6080午夜伦理| 亚洲成av人片在www色猫咪| 五月婷婷综合激情网| 久久久噜噜噜久噜久久综合| 久久av一区二区三| 久久99久久久久久久久久久| 欧美成人精品欧美一级乱| 欧美日韩mv| 国产又爽又黄ai换脸| 国产伦一区二区三区| 精品欧美一区二区久久久伦| 最新国产精品精品视频| 91精品在线看| 久久久国产精品网站| 国产精品av电影| 粉嫩一区二区| 欧美在线观看视频| h片视频在线观看| 欧美日韩成人黄色| av免费在线免费| 精品国内自产拍在线观看| 成人影视在线播放| 国产一区二区三区四区福利| 日韩在线无毛| 亚洲欧美国产精品| 性xxxx视频| 日韩精品www| 天堂影院在线| 日韩av中文字幕在线| 香蕉视频免费看| 亚洲激情成人网| 日本激情一区二区| 亚洲国产精品悠悠久久琪琪| 国产小视频一区| 亚洲第一av网| 午夜福利一区二区三区| 亚洲精品99999| 青青草在线视频免费观看| 日韩国产欧美精品一区二区三区| 五月婷婷丁香花| 亚洲免费中文字幕| 国产乱视频在线观看| 中文亚洲视频在线| 日本蜜桃在线观看| 色综合色综合久久综合频道88| 午夜影院免费在线| 午夜精品久久久久久久久久久久久| 波多野一区二区| 欧美亚洲国产日本| 97欧美成人| 91亚洲精品久久久| 丁香综合av| 欧美一区二区三区精美影视| 成人羞羞视频在线看网址| 伊人色综合久久天天五月婷| 欧美淫片网站| 夜夜添无码一区二区三区| 亚洲在线播放| 国产精品一区二区小说| 国内精品自线一区二区三区视频| 欧美老女人bb| 26uuu国产一区二区三区| 国产探花视频在线播放| 成人欧美一区二区三区白人| 久久成人在线观看| 在线看日本不卡| 国产毛片毛片毛片毛片| 亚洲国产日韩欧美在线图片| 国产女主播在线写真| 久久亚洲电影天堂| 国产亚洲成av人片在线观看| 国产精品亚洲激情| 97视频一区| 亚洲免费视频一区| 欧美日韩一区自拍| 男人天堂成人在线| 国产精品99久久久久久有的能看 | 日韩美女毛片| 在线一区亚洲| 国产亚洲一区在线| 日韩av.com| 久久婷婷综合激情| 中文字幕求饶的少妇| 午夜激情一区二区三区| 国产女优在线播放| 精品国产一区二区三区忘忧草| 国产精品一级伦理| 韩国日本不卡在线| 欧美亚洲人成在线| 欧美日韩电影一区二区| 中文字幕一区二区三三| 91av俱乐部| 91亚洲精华国产精华精华液| √天堂中文官网8在线| 色综合一区二区| 好吊色一区二区| 久久精品一偷一偷国产| 日韩免费福利视频| 高清国产一区| 久久精品影视| 三年中国国语在线播放免费| 不卡av电影在线播放| 欧美做爰啪啪xxxⅹ性| 欧洲亚洲国产日韩| 天天射天天操天天干| 欧美精品免费看| 色综合一区二区日本韩国亚洲| 欧美激情国产日韩| aa级大片欧美三级| 蜜臀视频在线观看| 亚洲精品国产高清久久伦理二区 | 精品国产乱码久久久久久1区2区 | 国产成人精品一区二区免费看京 | 九色porny丨首页入口在线| 亚洲自拍中文字幕| 99久久99热这里只有精品| 天堂在线资源视频| 久久精品亚洲乱码伦伦中文| 在线观看日本网站| 日韩av在线免播放器| caoporn-草棚在线视频最| 99久久综合狠狠综合久久止| 欧美国产一区二区三区激情无套| 超碰在线人人爱| 国产三级精品三级| 成人黄色激情视频| 在线观看国产欧美| 国产电影一区二区三区爱妃记| 免费毛片一区二区三区久久久| 一本久道久久久| jizz日本免费| 欧美性69xxxx肥| 你懂的视频在线免费| 国产v综合ⅴ日韩v欧美大片| 一本色道久久综合狠狠躁的番外| 欧美精品一区免费| 久久婷婷国产综合国色天香 | 丁香花在线观看完整版电影| 99在线视频播放| 伊人成人在线视频| 精品影片一区二区入口| 亚洲第一精品在线| 天堂√在线中文官网在线| 91黑丝高跟在线| 在线成人动漫av| 亚洲精品高清无码视频| 国产精品久久久99| 国产精品久久久久久久久毛片| 久久精品久久久久| 日韩激情综合| 男女高潮又爽又黄又无遮挡| 91香蕉视频mp4| 真实新婚偷拍xxxxx| 久久精视频免费在线久久完整在线看| 国产精品久久免费视频 | 日韩在线a电影| 国产精品视频一区二区在线观看| 欧美一区二区三区在线视频| 爱看av在线| 日本高清不卡一区二区三| 久久99久久99小草精品免视看| 国产日韩欧美在线观看视频| 精品国产一区二区三区av性色| 台湾佬中文娱乐网欧美电影| 日韩欧美一区二区在线观看 | 一区视频在线看| 婷婷色一区二区三区| 欧美一区二区二区| 性孕妇free特大另类| 亚洲人一区二区| 成人av资源在线| 中文字幕福利视频| 欧美极品少妇全裸体| 欧美美女一区| 亚洲精品一二三四| 色婷婷久久久久swag精品 | 欧美少妇另类| 91免费人成网站在线观看18| 亚洲综合好骚| 三级影片在线看| 亚洲欧美日韩天堂| 大桥未久女教师av一区二区| www.涩涩涩| 精品久久久一区| 在线网址91| 日日噜噜噜噜夜夜爽亚洲精品| 成人一级黄色片| 中文字幕在线2019| 欧美综合在线第二页| 综合一区在线|