動態代理常用的兩種方式?

口語化回答

好的,面試官,動態常見的兩種,一種是 jdk 動態代理,一種是 cglib 動態代理,兩者的最主要區別是 jdk 動態代理主要是依賴于接口創建代理對象,cglib 是通過生成子類的方式,不需要接口,兩種經常會在一起配合,假設類沒有接口的時候,就可以通過 cglib 來彌補不足。從性能上來看,因為 jdk 使用反射機制,他的性能,相比 cglib 稍有遜色。cglib 會更占用內存一些。兩者都可以滿足各種需求,按照有沒有接口的原則進行選擇。

題目解析

常考題,兩種方式非常清晰,大家要記住的是兩種所適應的場景,有沒有接口的一個區別,這道題后面,經常就會引入出來,spring 用的是什么。

面試得分點

jdk 動態代理,cglib,有無接口,子類

題目詳細答案

動態代理常用的兩種方式是基于接口的動態代理(JDK 動態代理)和基于類的動態代理(CGLIB 動態代理)。

JDK 動態代理

JDK 動態代理是 Java 標準庫提供的一種動態代理機制,它依賴于接口來創建代理對象。JDK 動態代理通過java.lang.reflect.Proxy類和java.lang.reflect.InvocationHandler接口實現。當你有一個接口并希望為該接口的實現類創建代理時,可以使用 JDK 動態代理。

CGLIB 動態代理

CGLIB(Code Generation Library)是一個強大的高性能代碼生成庫,它通過生成子類的方式來為目標類創建代理對象。CGLIB 動態代理不需要接口,可以直接代理類。當你沒有接口,只有具體類時,可以使用 CGLIB 動態代理。

比較

依賴性

JDK 動態代理依賴于接口,如果沒有接口就無法使用。

CGLIB 動態代理可以直接代理類,不需要接口。

性能

JDK 動態代理由于需要通過反射調用方法,性能可能會有所影響。

CGLIB 動態代理通過生成字節碼來創建代理類,性能通常比 JDK 動態代理更高,但生成字節碼的過程會稍微多占用一些內存。

使用場景

JDK 動態代理適用于有接口的情況,適用于大多數常見的業務場景。

CGLIB 動態代理適用于沒有接口的情況,適用于需要代理大量具體類的場景。

動態代理兩種實現方式的通俗解釋

面試官您好,關于JDK動態代理和CGLIB動態代理的區別,我用一個生活中的例子來簡單說明:

核心區別(用租房中介類比)

  1. JDK動態代理 - 像"正規房屋中介"
    • 必須通過租房平臺(接口)才能代理
    • 租客只能通過平臺聯系房東(必須實現接口)
    • 流程規范但靈活性較低
  1. CGLIB動態代理 - 像"熟人介紹的二房東"
    • 直接和房東打交道(不需要接口)
    • 可以改造房屋(增強原有類方法)
    • 更靈活但需要更多手續(生成子類)

具體差異對比

對比項

JDK動態代理

CGLIB動態代理

代理原理

實現接口

繼承目標類生成子類

接口要求

必須實現至少一個接口

不需要接口

性能

反射調用稍慢

直接方法調用更快

內存占用

較小

較大(需要生成子類字節碼)

適用場景

Spring默認對接口的代理

Spring對普通類的代理

限制

無法代理無接口類

無法代理final類/方法

實際項目中的選擇

在我們項目中:

  1. 如果服務類有接口定義,Spring默認用JDK代理(如Service層接口)
public interface UserService {void addUser();
}@Service
public class UserServiceImpl implements UserService {...}
  1. 如果沒有接口(如Controller),Spring自動切換CGLIB
@Controller  // 沒有實現接口
public class UserController {...}

性能優化的經驗

  1. JDK代理優化
    • 減少反射調用(如緩存Method對象)
    • 適合代理方法較少的接口
  1. CGLIB優化
    • 使用Spring Boot 2.x+默認CGLIB
    • 避免代理final方法
    • 大項目要監控PermGen/Metaspace

Spring中的特殊處理

Spring其實很智能:

  • 如果類實現了接口,優先用JDK代理
  • 如果沒有接口,自動用CGLIB
  • 可以通過配置強制使用CGLIB:
@EnableAspectJAutoProxy(proxyTargetClass = true)

常見誤區提醒

  1. 不是CGLIB一定比JDK快
    • 簡單場景差異不大
    • CGLIB初始化成本更高
  1. 代理嵌套問題
@Transactional
@Cacheable
public void foo() {}  // 兩種代理可能產生順序問題
  1. this調用失效
public void bar() {this.foo(); // 不走代理!
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/92306.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/92306.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/92306.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

StarRocks vs ClickHouse:2025 年 OLAP 引擎終極對比指南

StarRocks 與 ClickHouse:高性能 OLAP 引擎的兩種選擇在當今數據驅動的商業環境中,選擇合適的分析型數據庫對于企業數據戰略至關重要。StarRocks 和 ClickHouse 作為兩款領先的 OLAP(在線分析處理)引擎,各自擁有獨特的…

RuoYi-Cloud 微服務本地部署詳細流程實錄(IDEA + 本地 Windows 環境)

本文以 RuoYi-Cloud 3.x 版本為例,開發工具用的是 IntelliJ IDEA,數據庫為 MySQL 8.x,注冊中心選用本地 Nacos 2.2.3,Redis 為 3.x/5.x 均可。親測全流程可用,細節與官方文檔略有不同,避免新手踩坑。 目錄 …

2025年了,程序員轉行還這么難?別愁!大模型這趟“順風車”,你搭不搭?

在“大齡程序員的未來在何方”這篇文章里比較樂觀地介紹了程序員保持競爭力的幾個方向,但現實依然是殘酷的:很多人將不得不離開軟件開發工作,轉型去從事其他職業。 當你要這么做時,就會感慨:想不到一切竟如此艱難&…

CEH、OSCP、CISP、CISSP 四大網絡安全認證攻略

以下是 CEH、OSCP、CISP、CISSP 四大網絡安全認證的詳細對比,涵蓋認證定位、考試難度、適用場景及職業方向,幫助你快速選擇適合自己的證書:1. 核心區別速覽認證發證機構定位 考試形式適合人群國際認可度CEHEC-Council道德黑客滲透測試基礎選擇…

SnapDevelop支持uni-app開發:跨平臺與原生體驗的完美融合

隨著移動互聯網的迅速發展,開發者面臨著多平臺需求和技術挑戰。傳統開發模式要求為每個平臺編寫獨立代碼,不僅浪費時間,還增加了維護難度。作為一款強大的低代碼開發工具,SnapDevelop打破了這一局限,通過對uni-app的支…

海康威視相機,MVS連接成功,但無圖像怎么辦?

問題:準備一個常見的海康 相機去海康機器視覺官網下載MVS軟件。打開軟件,連接相機。顯示連接成功,并能看到相機的信息。點擊開始采集發現沒有圖像解決:右側找到觸發。1. 觸發模式 ON2.選擇 軟觸發3 啟用自動觸發點擊采集有圖像但一…

Linux systemd 系統管理:systemctl 控制服務與守護進程

Linux systemd 系統管理:systemctl 控制服務與守護進程系統啟動過程 Linux 系統的啟動過程遵循以下步驟: 開機自檢:計算機啟動后,BIOS/UEFI 進行硬件自檢,確認硬件設備正常MBR 引導:從指定的啟動設備讀取主…

《Day2-PyTorch Tensor 從入門到實踐:核心操作與避坑指南》

一、Tensor的創建 在Torch中張量以 "類" 的形式封裝起來,對張量的一些運算、處理的方法被封裝在類中,官方文檔: torch — PyTorch 2.7 documentation 1. 基本創建方式 以下講的創建tensor的函數中有兩個有默認值的參數dtype和d…

兩種格式數據介紹——bin 、 yuv文件

一、場景存儲 通常指的是用于存儲攝像頭或傳感器原始采集數據的文件格式,尤其是在自動駕駛、機器人、安防、工業視覺等需要記錄真實世界場景的應用中。格式存儲內容用途場景特點.binLiDAR點云、毫米波雷達數據、IMU、GPS、原始傳感器幀自動駕駛仿真、SLAM建圖、數據…

【網絡運維】Linux:SELinux簡介和配置

SELinux 介紹 SELinux 概述 文件權限控制了哪些用戶或用戶組可以訪問哪些特定文件,但未限定用戶訪問文件的方式。 例如:對于文件的寫入權限而言, 結構化數據文件是否應當設計為只能使用特定的程序寫入,但其他編輯器仍可以打開和修…

GaussDB SQL執行計劃詳解

1 問題現象SQL執行計劃是GaussDB性能分析及調優的核心,它輸出三個關鍵信息:訪問路徑:掃描表數據的路徑。連接順序:多表連接順序。連接方式:多表連接方式。2 技術背景GaussDB SQL語句執行計劃是數據庫為運行SQL語句而執行的操作步驟…

02.【數據結構-C語言】順序表(線性表概念、順序表實現:增刪查、前向聲明、順序表實現通訊錄項目:增刪改查、通訊錄數據導入及保存到本地文件)

目錄 1. 線性表 2. 順序表概念及分類 2.1 順序表的概念 2.2 順序表分類 2.3 動靜態順序表對比 3. 順序表的實現(附完整版代碼) 3.1 順序表結構體聲明 3.2 初始化&銷毀 3.3 插入(尾插、頭插、指定位置之前插入) 3.4 …

MyBatis核心配置深度解析:從XML到映射的完整技術指南

🔧 MyBatis核心配置深度解析:從XML到映射的完整技術指南 🚀 引言:MyBatis作為Java生態中最受歡迎的持久層框架之一,其強大的配置體系是實現靈活數據訪問的核心。本文將深入解析MyBatis的配置文件架構、映射機制以及高級…

OpenCV HSV與RGB顏色模型的區別

HSV與RGB顏色模型的區別 HSV(Hue, Saturation, Value)和 RGB(Red, Green, Blue)是兩種不同的顏色表示方式,主要區別如下:對比項RGBHSV定義基于紅、綠、藍三原色的混合基于色相(H)、飽…

具有柔性關節的機械臂matlab仿真

柔性關節機械臂MATLAB仿真方案,包含動力學建模、控制器設計和可視化分析。該方案基于拉格朗日方程建立柔性關節模型,并實現了PD控制、滑模控制和自適應控制三種控制策略。 MATLAB仿真 %% 柔性關節機械臂仿真 - 完整系統 % 作者: MATLAB技術助手 % 日期: …

數據結構—隊列和棧

1.二級指針的使用二級指針: 1. 在被調函數中,想要修改主調函數中的指針變量,需要傳遞該指針變量的地址,形參用二級指針接收。 2.指針數組的數組名是一個二級指針,指針數組的數組名作為參數傳遞時,可用二級指…

均線:從市場脈搏到量子計算的時空密碼

一部跨越百年的技術分析進化史,揭示金融市場的數學本質 引言:金融市場的永恒羅盤 在華爾街百年風云中,一個簡單的數學工具始終閃耀著智慧光芒——移動平均線(Moving Average)。從杰西利弗莫爾的手繪圖表到文藝復興科技的量子模型,均線系統完成了從經驗工具到科學框架的驚…

Python 通過Playwright+OpenCV破解滑動驗證碼 實例

由于公司最近需要對接某業務系統,涉及到部分數據需要提交至其它平臺業務系統,只有其它平臺賬戶,沒有接口,因此做此開發。首先通過OpenCV計算出驗證驗證碼滑塊距離,根據距離,使用 Playwright 利用滑動距離模…

山東省天地圖API申請并加載到QGIS和ArcGIS Pro中

目的:在QGIS/ArcGIS Pro中加載山東省不同時期的歷史影像1、申請API 山東省天地圖的API和國家天地圖的API不通用,需要單獨申請。 https://shandong.tianditu.gov.cn/ 打開本地服務資源找到影像的詳情頁 點擊申請地址按照下面的步驟一步一步來,…

qt窗口--02

文章目錄qt窗口--02QMessageBoxQColorDialogQFileDialogQFontDialogQInputDialog、結語很高興和大家見面,給生活加點impetus!!開啟今天的編程之路!! 作者:?( ‘ω’ )?260 我的專欄:qt&#…