Spring 的@Transactional 註解:詳解
背景
簡化資料庫事務的聲明式管理。當應用於方法時,它確保底層資料庫操作在事務內執行。然而,與此註釋相關的特定技術細節和限制需要仔細檢查。代理程式建立
為了動態攔截方法調用,Spring 使用 Java 動態代理( JDK)或 CGLIB 代理。代理類別也稱為被通知類,它繼承了原始註解類別的介面並實作了方法。代理充當客戶端和原始類別之間的中介,提供抽象層。內部方法調用
根據 Spring 的文檔,外部方法調用是透過代理被攔截並適當處理,包括事務管理。但是,自呼叫(即帶有註解的類別中的方法呼叫同一類別中的另一個方法)不會被攔截。這是由於代理機制的工作方式以及 this 引用的處理方式所造成的。為什麼有限制?
當一個方法呼叫同一個方法中的另一個方法時類,它直接透過 this 引用來執行此操作,繞過代理。這意味著代理不參與內部方法調用,因此無法注入事務管理行為。克服限制
要克服此限制,有一種解決方案就是使用 BeanFactoryPostProcessor 在運行時將代理的實例注入到自引用類中。透過將此代理引用保存到變量,可以透過代理定向內部調用,從而應用事務管理邏輯。其他資源
以上是Spring的@Transactional註解如何處理內部方法呼叫?的詳細內容。更多資訊請關注PHP中文網其他相關文章!