精品欧美一区二区三区在线观看 _久久久久国色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视频在线观看免费| 在线亚洲成人| 亚洲天堂网站在线观看视频| 日韩精品视频一二三| 黄在线免费观看| av网站免费线看精品| 日本国产精品视频| 黄色录像一级片| 老司机aⅴ在线精品导航| 在线精品国精品国产尤物884a| 自拍偷拍亚洲色图欧美| 懂色av成人一区二区三区| 久久亚洲图片| 欧美激情精品在线| 亚洲自拍偷拍图| 一区二区三区免费在线看| 欧美性xxxx在线播放| 在线视频一区观看| 污污视频在线免费看| 激情图区综合网| 欧美专区日韩视频| 欧美国产日韩综合| 欧洲福利电影| 日韩久久午夜影院| 小日子的在线观看免费第8集| 成人免费网站视频| 一区二区三区精品视频| 亚洲欧美制服第一页| 久久久久xxxx| 欧美三级精品| 亚洲成人激情av| 性欧美18一19内谢| 超碰国产在线观看| 久久亚洲私人国产精品va媚药| 亚洲一区二区自拍| 在线亚洲欧美日韩| 日韩电影在线免费| 欧美有码在线视频| 日本一区二区三区免费视频| 一区二区三区午夜视频| 在线日韩日本国产亚洲| 亚洲中文字幕一区| 国产欧美三级电影| 日韩欧美一区二区视频| 超碰人人草人人| julia一区二区三区中文字幕| 精品女厕一区二区三区| 欧美这里只有精品| 很黄的网站在线观看| 国产精品三级在线观看| 日韩免费毛片| 福利成人在线观看| 国产日韩欧美不卡在线| 欧美一区三区二区在线观看| 无码国精品一区二区免费蜜桃| 成人网页在线观看| 国产精成人品localhost| 国产成人av免费看| 国产suv一区二区三区88区| 91在线观看欧美日韩| 一区二区三区黄| 精东粉嫩av免费一区二区三区| 国产欧美一区二区白浆黑人| 亚洲国产精品一区二区久久hs| 久久av综合| 亚洲香蕉成人av网站在线观看| 欧美成人国产精品一区二区| 国产免费av一区二区三区| 欧美日韩久久久久久| 香蕉视频禁止18| 国产精品久久久久久久久久齐齐| 欧美日韩在线观看一区二区| 伊人网在线综合| 麻豆国产精品| 亚洲а∨天堂久久精品喷水| 疯狂揉花蒂控制高潮h| 亚洲调教一区| 最近2019年好看中文字幕视频| 精品在线观看一区| 欧美日韩国产成人精品| 国产91精品久久久久久久| 亚洲国产av一区二区三区| 日本大胆欧美人术艺术动态| 国产日韩一级二级三级| 亚洲自拍偷拍网址| 日本波多野结衣在线| 久久嫩草精品久久久精品一| 在线成人性视频| 色呦呦在线免费观看| 久久先锋资源网| 视频一区亚洲| 九色91在线| 色综合天天天天做夜夜夜夜做| 污视频免费在线观看网站| 精品国产亚洲一区二区三区大结局| 亚洲变态欧美另类捆绑| www.黄色在线| 亚洲网站视频| 国产精品久久久久高潮| 精品久久久中文字幕人妻| 麻豆成人久久精品二区三区小说| 亚洲xxx自由成熟| 无码国产精品一区二区色情男同| 国产精品久久久久永久免费观看| 欧洲精品一区二区三区久久| 国产亚洲精品精品国产亚洲综合| 精品噜噜噜噜久久久久久久久试看| 瑟瑟视频在线观看| 欧美永久精品| 国产精品成人av性教育| 亚洲av无码一区二区三区dv| 中文乱码免费一区二区| 国产一线二线三线女| 国产精品伦一区二区| 亚洲精品国产精品国自产观看浪潮| 成人精品一二三区| 亚洲一区日韩| av在线不卡一区| 午夜在线免费观看视频| 丰满岳妇乱一区二区三区| 91香蕉视频免费看| 欧美日中文字幕| 91精品国产高清久久久久久| 国产欧美久久久精品免费| 久久久国产综合精品女国产盗摄| 免费的一级黄色片| 亚洲人成网站在线在线观看| 亚洲人成电影在线播放| 日韩女优在线观看| 国产成人av电影在线观看| 亚洲三区四区| 日韩免费小视频| 日韩高清a**址| 久青草免费视频| 国产乱子轮精品视频| 亚洲一区在线免费| 国产另类xxxxhd高清| 日韩精品福利在线| 日韩成人在线免费视频| 成人一道本在线| 日韩精品免费一区| 久久国产精品免费一区二区三区| 日韩在线观看你懂的| 性色av一区二区三区四区| 久久久国产一区二区三区四区小说 | 手机福利在线视频| 久久精品资源| 日韩专区在线播放| 在线播放成人av| 国产日韩精品一区| 亚洲人辣妹窥探嘘嘘| 日韩av久操| 国产日韩欧美在线| 欧美三级理伦电影| 91精品婷婷国产综合久久性色| 国产乱子轮xxx农村| 久久99热国产| 天天做天天爱天天高潮| 麻豆国产一区二区三区四区| 欧美成人午夜免费视在线看片 | 亚洲精品suv精品一区二区| 久久久精品视频免费| 成人午夜短视频| 精品无码国模私拍视频| 亚洲精品动态| 国产精品男人的天堂| 免费黄网在线观看| 欧美成人欧美edvon| 日韩免费在线视频观看| 国产亚洲一本大道中文在线| 亚洲一区日韩精品| 欧美激情第二页| 国产精品免费一区二区三区四区| 性猛交xxxx| 亚洲成人免费在线| 国产jjizz一区二区三区视频| 免费日本视频一区| 欧美xxxx吸乳| 精品伊人久久久| 国产精品白丝jk喷水视频一区| 国产视频在线播放| 亚洲国产天堂久久综合网| 丁香社区五月天| 亚洲三级在线免费| 国产一级二级在线观看| 奇米777欧美一区二区| 国产免费xxx| 亚洲第一福利社区| 成人免费黄色网| 日韩av影片| xxx成人少妇69| 婷婷综合激情网| 欧美日韩久久不卡| 国产一级片播放| 国产欧美一区二区三区沐欲| 91日韩精品视频| 国产日本精品| 伊甸园精品99久久久久久| 国产精品一线| 国产美女高潮久久白浆| 僵尸再翻生在线观看| 色老头一区二区三区| 人人妻人人澡人人爽精品日本 | 久久久www成人免费无遮挡大片| 日本免费色视频| 欧美亚洲在线| 狠狠精品干练久久久无码中文字幕| 免费看日本一区二区| 3d动漫啪啪精品一区二区免费 | 成人精品网站在线观看| 美女的胸无遮挡在线观看| 日韩视频免费看| 日韩毛片在线一区二区毛片| 日韩视频国产视频| 中文在线观看av| 欧美午夜性色大片在线观看| 欧美丰满艳妇bbwbbw| 国产精品成人一区二区艾草| 精品人妻无码一区二区三区| 风间由美性色一区二区三区| 亚洲一级免费在线观看| 视频一区国产视频| 18禁网站免费无遮挡无码中文| 中文字幕免费一区二区| 亚洲一区二区高清视频| 国产九一精品| 久久国产精品久久精品国产| 爱高潮www亚洲精品| 亚洲一区二区久久久久久| 国产亚洲欧美日韩精品一区二区三区 | 欧美男男video| 美女精品久久久| 美女写真理伦片在线看| 中文综合在线观看| 国产毛片在线看| 亚洲小视频在线| 欧美大片aaa| 精品一区精品二区| 天天操天天干天天操| 亚洲第一免费网站| 亚洲国产欧美另类| 日韩欧美高清在线| 国产浮力第一页| 日韩欧美一二三区| www.色婷婷.com| 日韩欧美在线网站| 午夜精品在线播放| 欧美zozo另类异族| 亚洲精品久久久久久久久久| 欧美tk—视频vk| 国精品人妻无码一区二区三区喝尿| 日韩三级av在线播放| 亚洲精品97久久中文字幕无码| 精品福利av导航| 日本美女一级视频| 亚洲精品一区中文| 国产裸舞福利在线视频合集| 中文字幕日韩精品在线| 在线观看麻豆| 久久精品成人欧美大片古装| 国产网站在线免费观看| 欧美风情在线观看| 国产精品一区二区日韩| 日韩av电影手机在线| 波多视频一区| 国产精品99导航| 色综合视频一区二区三区44| 91影院在线免费观看视频| 国产精品久久久网站| 欧美日韩精品免费看| 日本久久一二三四| 亚洲高潮无码久久| 日韩视频二区| 人人干人人视频| 国产在线播放一区三区四| 在线观看成人动漫| 日韩精品亚洲一区二区三区免费| 在线观看av日韩| 国产一区二区按摩在线观看| 无码成人精品区在线观看| 久久亚洲一区二区三区四区| 亚洲精品自拍视频在线观看| 一区二区不卡在线播放| 成人毛片18女人毛片| 欧美日韩中字一区| 亚洲第一大网站| 亚洲人永久免费| 91一区二区三区在线| 57pao成人国产永久免费| 日韩精品一区二区三区av| 666精品在线| 嫩草一区二区三区| 国产系列第一页| 亚洲一区日韩在线| 日本中文字幕在线不卡| 91啪九色porn原创视频在线观看| 潮喷失禁大喷水aⅴ无码| 亚洲综合丝袜美腿| 337p粉嫩色噜噜噜大肥臀| 日韩视频123| 高清毛片在线看| 91国产高清在线| 成人97精品毛片免费看| 久久综合色一本| 伊人久久大香线蕉精品组织观看| 成人在线观看a| 大陆成人av片| 中文字幕美女视频| 色国产综合视频| 日韩在线一区二区三区四区| 久久精品亚洲94久久精品| 国产免费不卡| 国产一区福利视频| 亚洲五月综合| 九热视频在线观看| 91一区二区三区在线观看| caoporn91| 欧美男男青年gay1069videost| 欧美性受xxx黑人xyx性爽| 日韩欧美国产三级| 免费av网站在线看| 国产精品电影一区| 首页亚洲中字| 人妻少妇精品久久| 国产精品夜夜爽| 国产色无码精品视频国产| 欧美午夜精品一区二区蜜桃| 全色精品综合影院| 午夜欧美大片免费观看| 日韩国产91| 亚洲一区尤物| 六月丁香婷婷色狠狠久久| 人妻一区二区视频| 色综合久久99| 能在线看的av| 91成人在线视频| 女一区二区三区| 国产午夜福利100集发布| 大陆成人av片| 99免费在线观看| 精品久久久久久久人人人人传媒| 中文字幕在线播放网址| 91中文精品字幕在线视频| 久久久久久久久久久妇女| 不卡中文字幕在线观看| 日韩理论片网站| 国产精品欧美激情在线| 日韩在线观看精品| 国产精品xnxxcom| 只有这里有精品| 国产精品亚洲第一| 18精品爽视频在线观看| 精品乱人伦小说| 亚洲精品88| 日本一区视频在线观看| 日本欧美在线看| 小向美奈子av| 日韩免费视频线观看| 爱看av在线| 欧美日韩在线一二三| 日本视频中文字幕一区二区三区| 性爱在线免费视频| 欧美高清视频不卡网| 最新国产露脸在线观看| 国产精品swag| 麻豆久久精品| 一级片久久久久| 欧美一区二区三区在线| 免费在线国产视频| 美女精品国产| 美女视频网站黄色亚洲| 91麻豆免费视频网站| 亚洲国产精品久久精品怡红院| 午夜影院一区| 这里只有精品66| 成人app下载| 自拍偷拍精品视频| 欧美大片大片在线播放| 欧洲在线一区| gogogo高清免费观看在线视频| 亚洲欧美国产高清| 丝袜+亚洲+另类+欧美+变态| 欧美成人精品不卡视频在线观看| www国产精品| 国产三级日本三级在线播放 | 久久亚洲国产成人精品性色| 亚洲精品久久久久久下一站| 精品国产欧美日韩一区二区三区| av磁力番号网| www欧美成人18+| 国产又粗又长又大视频| 韩国精品美女www爽爽爽视频| 狠狠做六月爱婷婷综合aⅴ| 日本特黄在线观看| 日韩欧美在线字幕| 四虎影院观看视频在线观看| 欧美精品一区二区视频| 国产乱淫av一区二区三区 | 青青青草视频在线|