欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

SpringAOP注解失效怎么辦

小編給大家分享一下Spring AOP注解失效怎么辦,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

創(chuàng)新互聯(lián)公司是一家從事企業(yè)網(wǎng)站建設、成都網(wǎng)站制作、網(wǎng)站建設、行業(yè)門戶網(wǎng)站建設、網(wǎng)頁設計制作的專業(yè)網(wǎng)站制作公司,擁有經(jīng)驗豐富的網(wǎng)站建設工程師和網(wǎng)頁設計人員,具備各種規(guī)模與類型網(wǎng)站建設的實力,在網(wǎng)站建設領域樹立了自己獨特的設計風格。自公司成立以來曾獨立設計制作的站點1000+。

@Transactional @Async等注解不起作用

之前很多人在使用Spring中的@Transactional, @Async等注解時,都多少碰到過注解不起作用的情況。

為什么會出現(xiàn)這些情況呢?因為這些注解的功能實際上都是Spring AOP實現(xiàn)的,而其實現(xiàn)原理是通過代理實現(xiàn)的。

JDK動態(tài)代理

以一個簡單的例子理解一下JDK動態(tài)代理的基本原理:

//目標類接口
public interface JDKProxyTestService {
  void run();
}

//目標類
public class JDKProxyTestServiceImpl implements JDKProxyTestService {
  public void run(){
    System.out.println("do something...");
  }
}

//代理類
public class TestJDKProxy implements InvocationHandler {

  private Object targetObject; //代理目標對象

  //構(gòu)造代理對象
  public Object newProxy(Object targetObject) {
    this.targetObject = targetObject;
    return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
        targetObject.getClass().getInterfaces(), this);
  }

  //利用反射,在原邏輯上進行邏輯增強
  public Object invoke(Object proxy, Method method, Object[] args)
      throws Throwable {
    //模擬事務開始
    assumeBeginTransaction();
    //原執(zhí)行邏輯
    Object ret = method.invoke(targetObject, args);
    //模擬事務提交
    assumeCommitTransaction();
    return ret;
  }

  private void assumeBeginTransaction() {
    System.out.println("模擬事務開始...");
  }

  private void assumeCommitTransaction() {
    System.out.println("模擬事務提交...");
  }
}

//測試
public class Test { 
  public static void main(String[] args) {
    TestJDKProxy jdkProxy = new TestJDKProxy();
    JDKProxyTestService proxy = (JDKProxyTestService) jdkProxy.newProxy(new JDKProxyTestServiceImpl());
    proxy.run();
  }
}

上面的例子應該能夠清楚的解釋JDK動態(tài)代理的原理了。它利用反射機制,生成了一個實現(xiàn)代理接口的匿名類,在調(diào)用具體方法前調(diào)用InvokeHandler來處理。我們通過代理類對象調(diào)用方法時,實際上會先調(diào)用其invoke方法,里面再調(diào)用原方法。這樣我們可以在原方法邏輯的前后統(tǒng)一添加處理邏輯。

Spring還有一種動態(tài)代理方式是CGLIB動態(tài)代理。它是把代理對象類的class文件加載進來,通過修改其字節(jié)碼生成子類來處理。雖然處理方式不一樣,但是代理的思想都是一致的。

如果被代理的目標對象實現(xiàn)了接口,那么Spring會默認使用JDK動態(tài)代理。所有該目標類型實現(xiàn)的接口都將被代理。若該目標對象沒有實現(xiàn)任何接口,則創(chuàng)建一個CGLIB代理。

Spring AOP注解失效及解決

基于以上對于動態(tài)代理原理的分析,我們來看以下兩個常見的問題:

同一個類中,方法A調(diào)用方法B(方法B上加有注解),注解無效

針對所有的Spring AOP注解,Spring在掃描bean的時候如果發(fā)現(xiàn)有此類注解,那么會動態(tài)構(gòu)造一個代理對象。

如果你想要通過類X的對象直接調(diào)用其中帶注解的A方法,此注解是有效的。因為此時,Spring會判斷你將要調(diào)用的方法上存在AOP注解,那么會使用類X的代理對象調(diào)用A方法。

但是假設類X中的A方法會調(diào)用帶注解的B方法,而你依然想要通過類X對象調(diào)用A方法,那么B方法上的注解是無效的。因為此時Spring判斷你調(diào)用的A并無注解,所以使用的還是原對象而非代理對象。接下來A再調(diào)用B時,在原對象內(nèi)B方法的注解當然無效了。

解決方法:

最簡單的方式當然是可以讓方法A和B沒有依賴,能夠直接通過類X的對象調(diào)用B方法。

但是很多時候可能我們的邏輯拆成這樣寫并不好,那么就還有一種方法:想辦法手動拿到代理對象。

AopContext類有一個currentProxy()方法,能夠直接拿到當前類的代理對象。那么以上的例子,就可以這樣解決:

// 在A方法內(nèi)部調(diào)用B方法
// 1.直接調(diào)用B,注解失效。
B()
// 2.拿到代理類對象,再調(diào)用B。
((X)AopContext.currentProxy()).B()

AOP注解方法里使用@Autowired對象為null

在之前的使用中,出現(xiàn)過在加上注解的方法中,使用其他注入的對象時,發(fā)現(xiàn)對象并沒有被注入進來,為null。

最終發(fā)現(xiàn),導致這種情況的原因是因為方法為private。因為Spring不管使用的是JDK動態(tài)代理還是CGLIB動態(tài)代理,一個是針對實現(xiàn)接口的類,一個是通過子類實現(xiàn)。無論是接口還是父類,顯然都不能出現(xiàn)private方法,否則子類或?qū)崿F(xiàn)類都不能覆蓋到。

如果方法為private,那么在代理過程中,根本找不到這個方法,引起代理對象創(chuàng)建出現(xiàn)問題,也導致了有的對象沒有注入進去。

所以如果方法需要使用AOP注解,請把它設置為非private方法。

以上是“Spring AOP注解失效怎么辦”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

分享標題:SpringAOP注解失效怎么辦
網(wǎng)站地址:http://www.aaarwkj.com/article8/gjcdop.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、域名注冊網(wǎng)站建設、手機網(wǎng)站建設網(wǎng)頁設計公司、網(wǎng)站導航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站
偷拍一区二区三区四区| 欧美午夜一区二区电影| 高清免费国产日日操夜夜草| 国产有码视频一区二区三区| 中文字幕人妻丝袜乱一区二区| 蜜臀人妻四季av一区二区不卡| 亚洲男人天堂日本一区| 福利在线午夜绝顶三级| 97视频免费观看在线| 亚洲精品有码中文字幕| 国产成人精品一二三四区| 欧美亚洲国产青草久久| 人妻系列少妇人妻偷人| 日本免费在线不卡一区二区| 日韩有码在线中文字幕| 97国产精品亚洲精品| 要爽死国产一区在线播放| 熟女一区二区三区免费视频| 青草免费在线播放视频| 日韩亚洲中文一区三级黄片| 国产高清剧情在线观看| 中文字幕日韩欧美资源站| 一区二区五区日韩国产| 日本精品在线一区二区| 和富婆啪啪一区二区免费看| 中文字幕你懂的在线观看| 日本中文字幕免费专区| 欧美日韩一区二区三区四区高清视频| 欧美精品一区二区三区色| 亚洲国产日韩一区二区在线| 99热这里只有精品最新| 精品视频一区二区三区中文字幕| 亚洲av成人精品日韩一区麻豆| 亚州无吗一区二区三区| 很黄无遮挡在线免费网站| 国产精品自拍国产精品| 色哟哟亚洲精品一区二区| 十八禁在线观看点击进入| 亚洲国产精品久久久精品| 精品人妻av区天天看片| 高潮内射主播自拍一区|