欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring AOP 支持哪兩種動態(tài)代理方式(最新推薦)

 更新時間:2025年06月27日 10:09:17   作者:冰糖心書房  
動態(tài)代理在運(yùn)行時創(chuàng)建目標(biāo)對象的增強(qiáng)代理,Spring AOP支持JDK代理(基于接口)和CGLIB代理(基于繼承),Spring Boot默認(rèn)使用CGLIB解決方法自調(diào)用問題,也可通過配置切換代理方式,本文給大家介紹Spring AOP支持哪兩種動態(tài)代理方式,感興趣的朋友一起看看吧

什么是動態(tài)代理?

動態(tài)代理就是,在程序運(yùn)行期,創(chuàng)建目標(biāo)對象的代理對象,并對目標(biāo)對象中的方法進(jìn)行功能性增強(qiáng)的一種技術(shù)。

在生成代理對象的過程中,目標(biāo)對象不變,代理對象中的方法是目標(biāo)對象方法的增強(qiáng)方法??梢岳斫鉃檫\(yùn)行期間,對象中方法的動態(tài)攔截,在攔截方法的前后執(zhí)行功能操作。

Spring AOP 支持以下兩種動態(tài)代理方式:

  1. JDK 動態(tài)代理 (JDK Dynamic Proxy)
  2. CGLIB 代理 (Code Generation Library)

Spring 框架會根據(jù)你的業(yè)務(wù)對象(目標(biāo)對象)的情況,智能地選擇其中一種來創(chuàng)建代理。

1. JDK 動態(tài)代理

  • 技術(shù)基礎(chǔ):Java 官方提供的 java.lang.reflect.Proxy 類和 java.lang.reflect.InvocationHandler 接口,是 Java 原生支持的。
  • 實(shí)現(xiàn)方式:在運(yùn)行時,創(chuàng)建一個新的代理類,這個代理類會實(shí)現(xiàn)目標(biāo)對象所實(shí)現(xiàn)的所有接口。
  • 硬性要求被代理的目標(biāo)對象必須實(shí)現(xiàn)至少一個接口。 如果一個類沒有實(shí)現(xiàn)任何接口,JDK 動態(tài)代理就無法為其創(chuàng)建代理。
  • 工作流程:當(dāng)你調(diào)用代理對象的方法時,這個調(diào)用會被轉(zhuǎn)發(fā)到 InvocationHandlerinvoke() 方法中。Spring AOP 在 invoke() 方法內(nèi)部織入了你的切面邏輯(如 @Before、@After 等),然后再通過 Java 的反射機(jī)制調(diào)用原始目標(biāo)對象的方法。

2. CGLIB 代理

  • 技術(shù)基礎(chǔ):一個強(qiáng)大的第三方代碼生成庫(Spring 內(nèi)部集成了它),它通過字節(jié)碼增強(qiáng) (Bytecode Enhancement) 技術(shù)來工作。
  • 實(shí)現(xiàn)方式:在運(yùn)行時,動態(tài)地創(chuàng)建一個被代理對象的子類作為代理對象。
  • 硬性要求:被代理的目標(biāo)類不能是 final 類,需要被代理的方法也不能是 finalprivate,因?yàn)樽宇悷o法繼承 final 類或重寫 final/private 方法。
  • 工作流程:代理類會重寫(Override)父類(即你的目標(biāo)對象)中所有非 final 的方法。在這些重寫的方法里,Spring AOP 織入了切面邏輯,然后再通過調(diào)用 super.method() 來執(zhí)行原始目標(biāo)對象的業(yè)務(wù)邏輯。

Spring 如何選擇?

這是面試中的高頻問題,因?yàn)檫@個默認(rèn)行為在不同版本中有所變化。

場景Spring 的選擇
目標(biāo)對象實(shí)現(xiàn)了接口老的 Spring 版本傳統(tǒng) Spring XML 配置中,默認(rèn)使用 JDK 動態(tài)代理

Spring Boot (2.x 及以后) 中,為了統(tǒng)一行為和解決一些代理問題,默認(rèn)依然使用 CGLIB。
目標(biāo)對象沒有實(shí)現(xiàn)接口無論在哪個版本,都只能使用 CGLIB。

為什么 Spring Boot 默認(rèn)使用 CGLIB?
主要原因是為了解決“方法自調(diào)用時 AOP 失效”的問題,并提供更一致的行為。使用 CGLIB 可以確保即使目標(biāo)對象實(shí)現(xiàn)了接口,代理的也是類本身,這在處理一些復(fù)雜的依賴注入和內(nèi)部調(diào)用場景時更加可靠。

當(dāng)然,你也可以通過在 application.properties 中進(jìn)行配置來改變這個默認(rèn)行為:

# 如果設(shè)置為 true (默認(rèn)值),則統(tǒng)一使用 CGLIB
# 如果設(shè)置為 false,則在目標(biāo)對象實(shí)現(xiàn)接口時,會優(yōu)先使用 JDK 動態(tài)代理
spring.aop.proxy-target-class=true 

總結(jié)對比

特性JDK 動態(tài)代理CGLIB 代理
代理方式基于接口 (實(shí)現(xiàn)共同接口)基于繼承 (創(chuàng)建子類)
前提條件目標(biāo)對象必須實(shí)現(xiàn)接口目標(biāo)對象不能是 final 類
性能在早期版本中,通過反射調(diào)用性能略低于 CGLIB。但在目前JDK 版本中,兩者性能差距已經(jīng)非常小。性能通常被認(rèn)為略高,因?yàn)樗苯硬僮髯止?jié)碼并調(diào)用 super。
Spring Boot 默認(rèn)

到此這篇關(guān)于Spring AOP 支持哪兩種動態(tài)代理方式?的文章就介紹到這了,更多相關(guān)spring aop動態(tài)代理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 強(qiáng)烈推薦 5 款好用的REST API工具(收藏)

    強(qiáng)烈推薦 5 款好用的REST API工具(收藏)

    市面上可用的 REST API 工具選項(xiàng)有很多,我們來看看其中一些開發(fā)人員最喜歡的工具。本文通過圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2020-12-12
  • java構(gòu)建Stream流的多種方式總結(jié)

    java構(gòu)建Stream流的多種方式總結(jié)

    Java?8引入了Stream流作為一項(xiàng)新的特性,它是用來處理集合數(shù)據(jù)的一種函數(shù)式編程方式,本文為大家整理了多種java構(gòu)建Stream流的方式,希望對大家有所幫助
    2023-11-11
  • Spring boot調(diào)用Oracle存儲過程的兩種方式及完整代碼

    Spring boot調(diào)用Oracle存儲過程的兩種方式及完整代碼

    這篇文章主要給大家介紹了關(guān)于Spring boot調(diào)用Oracle存儲過程的兩種方式及完整代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Mybatis pagehelper分頁插件使用過程解析

    Mybatis pagehelper分頁插件使用過程解析

    這篇文章主要介紹了mybatis pagehelper分頁插件使用過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • java實(shí)現(xiàn)網(wǎng)頁驗(yàn)證碼功能

    java實(shí)現(xiàn)網(wǎng)頁驗(yàn)證碼功能

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)網(wǎng)頁驗(yàn)證碼功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • Spring?Security?過濾器注冊脈絡(luò)梳理

    Spring?Security?過濾器注冊脈絡(luò)梳理

    這篇文章主要介紹了Spring?Security過濾器注冊脈絡(luò)梳理,Spring?Security在Servlet的過濾鏈中注冊了一個過濾器FilterChainProxy,它會把請求代理到Spring?Security自己維護(hù)的多個過濾鏈,每個過濾鏈會匹配一些URL,如果匹配則執(zhí)行對應(yīng)的過濾器
    2022-08-08
  • Java自然排序Comparable使用方法解析

    Java自然排序Comparable使用方法解析

    這篇文章主要介紹了Java自然排序Comparable使用方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 微信小程序與Java后端接口交互

    微信小程序與Java后端接口交互

    本文主要介紹了微信小程序與Java后端接口交互,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 淺談java多線程 join方法以及優(yōu)先級方法

    淺談java多線程 join方法以及優(yōu)先級方法

    下面小編就為大家?guī)硪黄獪\談java多線程 join方法以及優(yōu)先級方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • Spring事務(wù)失效之常見場景分析

    Spring事務(wù)失效之常見場景分析

    這篇文章主要介紹了Spring事務(wù)失效之常見場景,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04

最新評論