动态代理常用的两种方式?

口语化回答

好的,面试官,动态常见的两种,一种是 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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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&#…