Spring AOP 註解為什麼失效?

来源:https://www.cnblogs.com/javastack/archive/2020/07/22/13361157.html
-Advertisement-
Play Games

使用Spring Aop註解的時候,如@Transactional, @Cacheable等註解一般需要在類方法第一個入口的地方加,不然不會生效。 如下麵幾種場景 1、Controller直接調用Service B方法:Controller > Service A 在Service A 上加@Tra ...


使用Spring Aop註解的時候,如@Transactional, @Cacheable等註解一般需要在類方法第一個入口的地方加,不然不會生效。

如下麵幾種場景

1、Controller直接調用Service B方法:Controller > Service A

在Service A 上加@Transactional的時候可以正常實現AOP功能。

2、Controller調用Service A方法,A再調用B方法:Controller > Service A > Service B

在Service B上加@Transactional的時候不能實現AOP功能,因為在Service A方法中調用Service B方法想當於使用this.B(),this代表的是Service類本身,並不是真實的代理Service對象,所以這種不能實現代理功能。

所以,如果不是直接調用的方式,是不能實現代理功能的,非常需要註意。

但確實有這種不是直接調用的試,也需要實現代理功能,怎麼做呢?很簡單,只需要暴露當前代理對象給當前線程就行了,如下配置,註解粗體的部分。

<!-- aspect -->

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

protected final T proxy() {

return (T) **AopContext.currentProxy()**;

}

這樣就能拿到代理對象了,在Service A中可以通過proxy().B()即可正常實現B方法上面的代理功能。

看下AopContext源碼,Spring會將當前代理對象綁定到當前線程ThreadLocal上面。

關於線程綁定變數參考Java技術棧微信公眾號分享的ThreadLocal文章。

關註公眾號Java技術棧回覆"面試"獲取我整理的2020最全面試題及答案。

推薦去我的博客閱讀更多:

1.Java JVM、集合、多線程、新特性系列教程

2.Spring MVC、Spring Boot、Spring Cloud 系列教程

3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程

4.Java、後端、架構、阿裡巴巴等大廠最新面試題

覺得不錯,別忘了點贊+轉發哦!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Java NIO是一種基於通道和緩衝區的I/O方式,已經被廣泛的應用,成為解決高併發與大量連接和I/O處理問題的有效方式。 Java NIO相關組件 Java NIO主要有三個核心部分組成,分別是:Channel(通道),Buffer(緩衝區), Selector(選擇器) Channel Chan ...
  • 存儲結構 threadLocal存儲於Thread類上的ThreadLocalMap類型的threadLocals中。 從ThreadLocalMap的名字上可以看出其結構類似於HashMap,它也是使用key-value結構的Entry數組table來存儲ThreadLocal和值。 但區別在於E ...
  • ###extern ######作用1:讓編譯器按C規則編譯函數名和變數名(保持名稱原樣,c++由於可以重載所以名稱前後會添加符號) #ifdef __cplusplus extern "C" { #endif #ifdef __cplusplus } #endif ######作用2:在頭文件中 ...
  • 上帝之火 本系列講述的是開源實時監控告警解決方案Prometheus,這個單詞很牛逼。每次我都能聯想到帶來上帝之火的希臘之神,普羅米修斯。而這個開源的logo也是火,個人挺喜歡這個logo的設計。 本系列著重介紹Prometheus以及如何用它和其周邊的生態來搭建一套屬於自己的實時監控告警平臺。 本 ...
  • 原文地址:https://www.wjcms.net/archives/%E4%BA%94%E5%88%86%E9%92%9F%E5%AD%A6%E4%BC%9Amarkdown%E5%9F%BA%E6%9C%AC%E8%AF%AD%E6%B3%95 寫在前面的話 寫在越來越多的人使用markdow ...
  • Laravel 框架實現無限極分類,更簡單高效的實現方式,無限極分類最佳實踐,open code 與大家共用!感興趣的 Mark 一下,謝謝~ ...
  • 前言 口味蝦又叫麻辣小龍蝦。在夏天的時候,邀上三五好友,來上幾盤口味蝦,搭配上啤酒,肥宅的生活就這麼快樂的開始了,味道麻辣爽口,一口下去就想吃下一口!在湖南,沒有吃上口味蝦的夏天都是不完整的。 那麼湖南的吃貨們都喜歡吃哪家的口味蝦呢?今天我們就用數據來盤一盤。 我們使用Python獲取了大眾點評上長 ...
  • PHP 自帶的 pcntl,存在很多不足,如: 沒有提供進程間通信的功能; 不支持重定向標準輸入和輸出; 只提供了 fork 這樣原始的介面,容易使用錯誤; Swoole\Process 提供瞭如下特性: 可以方便的實現進程間通訊; 支持重定向標準輸入和輸出,在子進程內 echo 不會列印屏幕,而是 ...
一周排行
    -Advertisement-
    Play Games
  • C#TMS系統代碼-基礎頁面BaseCity學習 本人純新手,剛進公司跟領導報道,我說我是java全棧,他問我會不會C#,我說大學學過,他說這個TMS系統就給你來管了。外包已經把代碼給我了,這幾天先把增刪改查的代碼背一下,說不定後面就要趕鴨子上架了 Service頁面 //using => impo ...
  • 委托與事件 委托 委托的定義 委托是C#中的一種類型,用於存儲對方法的引用。它允許將方法作為參數傳遞給其他方法,實現回調、事件處理和動態調用等功能。通俗來講,就是委托包含方法的記憶體地址,方法匹配與委托相同的簽名,因此通過使用正確的參數類型來調用方法。 委托的特性 引用方法:委托允許存儲對方法的引用, ...
  • 前言 這幾天閑來沒事看看ABP vNext的文檔和源碼,關於關於依賴註入(屬性註入)這塊兒產生了興趣。 我們都知道。Volo.ABP 依賴註入容器使用了第三方組件Autofac實現的。有三種註入方式,構造函數註入和方法註入和屬性註入。 ABP的屬性註入原則參考如下: 這時候我就開始疑惑了,因為我知道 ...
  • C#TMS系統代碼-業務頁面ShippingNotice學習 學一個業務頁面,ok,領導開完會就被裁掉了,很突然啊,他收拾東西的時候我還以為他要旅游提前請假了,還在尋思為什麼回家連自己買的幾箱飲料都要叫跑腿帶走,怕被偷嗎?還好我在他開會之前拿了兩瓶芬達 感覺感覺前面的BaseCity差不太多,這邊的 ...
  • 概述:在C#中,通過`Expression`類、`AndAlso`和`OrElse`方法可組合兩個`Expression<Func<T, bool>>`,實現多條件動態查詢。通過創建表達式樹,可輕鬆構建複雜的查詢條件。 在C#中,可以使用AndAlso和OrElse方法組合兩個Expression< ...
  • 閑來無聊在我的Biwen.QuickApi中實現一下極簡的事件匯流排,其實代碼還是蠻簡單的,對於初學者可能有些幫助 就貼出來,有什麼不足的地方也歡迎板磚交流~ 首先定義一個事件約定的空介面 public interface IEvent{} 然後定義事件訂閱者介面 public interface I ...
  • 1. 案例 成某三甲醫預約系統, 該項目在2024年初進行上線測試,在正常運行了兩天後,業務系統報錯:The connection pool has been exhausted, either raise MaxPoolSize (currently 800) or Timeout (curren ...
  • 背景 我們有些工具在 Web 版中已經有了很好的實踐,而在 WPF 中重新開發也是一種費時費力的操作,那麼直接集成則是最省事省力的方法了。 思路解釋 為什麼要使用 WPF?莫問為什麼,老 C# 開發的堅持,另外因為 Windows 上已經裝了 Webview2/edge 整體打包比 electron ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...