Spring Boot 中是使用 JDK Proxy 动态代理还是 CGLib ?

news2025/1/19 11:08:43

1. Spring Boot 中是使用 JDK Proxy 动态代理还是 CGLib ?

        首先我们知道在 Spring 里面,动态代理的底层,默认使用的是 JDK Proxy 代理,这一点在官方文档有具体的说明:

        既然 Spring 中的动态代理默认使用 JDK Proxy,那么在 Spring Boot 中是否也是使用 JDK Proxy 呢 ?

答案是否,Spring Boot 的动态代理默认使用的是 CGLib

这一点在 spring-configuration-metadata.json 文件中有体现 >>

我们带着疑惑来看下面这个案例,看看 Spring Boot 中的动态代理是否真的使用了 CGLib ?

Controller:

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private IUserService userService;

    @RequestMapping("/sayhi")
    public void sayHi() {
        userService.sayHi();
    }
}

service 接口:

public interface IUserService {
    void sayHi();
}

ServiceImpl:

@Service
public class UserServiceImpl implements IUserService {
    @Override
    public void sayHi() {
    }
}

使用 AOP 拦截目标方法:

@Aspect // 切面
@Component
public class LoginAspect {

    @Before("execution(* com.example.demo.service.impl.UserServiceImpl.*(..))")
    public void doBefore(JoinPoint joinPoint) {
        System.out.println("拦截 sayHi 方法:" +
                joinPoint.getSignature().getName());
    }
}

打断点,启动项目访问 sayhi 接口:

此时,我们发现 Spring Boot 动态代理底层确实使用了 CGLib 来实现。

🍁【思考一】

        我们都知道使用 CGLIb 实现代理,被代理类是不能被 final 修饰的,因为 CGLib 是通过生成目标类的子类来保证代理类和被代理类的方法名一致,从而实现动态代理的,那如果上述被代理类使用 final 修饰,再次运行程序时,它底层是改成 JDK Proxy 代理呢 ?还是程序执行报错呢 ?

// 被代理类
@Service
public final class UserServiceImpl implements IUserService {
    @Override
    public void sayHi() {
    }
}

运行程序时报错:错误信息也很明显

【结论一】 

        Spring Boot 使用动态代理时,底层默认使用的是 CGLib,并且是强制性的,一旦目标类被 final 修饰了,那么程序运行时就会报错,而不是使用 JDK Proxy 来完成代理。

如果想要让 Spring Boot 动态代理使用 JDK Proxy 也是可以的,不过需要配置两个属性:

# 是否启用 AOP
Spring.aop.auto=true
# 代理方式:设置为 true 表示强制使用 CGLib,false 表示使用 JDK
Spring.aop.proxy-target-class=false

properties 文件中配置了这两属性,再次打断点查看(确实使用了 JDK):

此时就算被代理类使用 final 修饰了,也可以被 JDK 代理。

🍁【思考二】

        我们都知道 JDK Proxy 实现的动态代理,被代理类是需要实现一个接口来保证代理类和被代理类的方法名一致,从而实现动态代理的,假设使用 JDK Proxy 动态代理时,目标类没有实现接口,程序运行时,是报错呢 ? 还是使用 CGLib 实现代理 ?

// 被代理类
@Service
public class UserServiceImpl {
    public void sayHi() {
    }
}

此时,在 Controller 中注入 UserServiceImpl,打断点查看(这次使用了 CGLib):

【最终结论】 

1.Spring Boot 默认的动态代理是 CGLib,并且是强制性的,加上 final,项目启动就会报错;

2.想让 Spring Boot 使用 JDK 代理,需要在配置文件中开启 AOP,并把代理方式的属性设为 false,才能使用 JDK 代理;

3.Spring Boot 使用 JDK 代理时,目标类如果没有实现接口,程序运行时,会使用 CGLib 来实现代理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/951503.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

交换机端口安全实验

文章目录 一、实验的背景与目的二、实验拓扑三、实验需求四、实验解法1. PC配置IP地址部分2. 在SW1上开启802.1X身份验证3. 创建一个用户身份验证的用户。用户名为wangdaye,密码为1234564.创建一个端口隔离组,实现三台PC无法互相访问 摘要: 本…

记录 使用 git 克隆仓库报错:Warning: Permanently added‘github.com’ to the .....(ssh )

解决方法: 1. 新建空文件夹->右键->点击 Git Bash Here2. 输入 cd C:3. 输入 cat ~/.ssh/id_rsa.pub4. 输入 ssh-keygen重复回车,生成一个矩形,则说明公钥已经生成了。重复步骤3,生成publickey,右键…

PCL 判断两条线段的平行性(三维空间)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 这里使用一种比较有趣的方式来判断三维空间中两条线段的平行性,我们都知道两条线段所代表的矢量进行叉乘计算所得数值,代表了由这两条线段组成的平行四边形的面积值,如下图所示: ok,那么如果将此结论推广到三维…

远程工作与协作实践:探讨在网络安全领域中进行远程工作和团队协作的最佳实践和工具推荐

第一章:引言 随着科技的迅猛发展,远程工作已经成为现代职场的一部分。特别是在网络安全领域,远程工作和团队协作变得越来越普遍。本文将探讨在网络安全领域中进行远程工作和团队协作的最佳实践和工具推荐,帮助从业人员更好地应对…

26.仪表板侧边栏菜单

效果 源码 <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Sidebar Menu</title> <link rel="stylesheet" type="text/css"…

DNS原理

文章目录 一、域名产生背景域名的树形层次化结构 二、定义三、DNS查询模式递归查询迭代查询 四、主机域名解析工作流程五、H3C配置DNS代理 首先可以看下思维导图&#xff0c;以便更好的理解接下来的内容。 一、域名 产生背景 在互联网中&#xff0c;通过IP地址访问目标主机…

如何使用Unity制作一个国际象棋

LinnoChess1.0 该项目旨在做一些Unity小游戏项目开发来练练手 如果有更新建议请私信RWLinno 项目地址&#xff1a;https://github.com/RWLinno/LinnoChess 目前效果 能够正常下棋&#xff1b;能够编辑棋盘&#xff1b;能够SL棋局&#xff1b;能够记录棋谱&#xff1b;能够显…

交换机端口安全

文章目录 一、802.1X认证1. 定义和起源2. 认证方式本地认证远程集中认证 3. 端口接入控制方式基于端口认证基于MAC地址认证 二、端口隔离技术1. 隔离组2. 隔离原理3. 应用场景 首先可以看下思维导图&#xff0c;以便更好的理解接下来的内容。 一、802.1X认证 1. 定义和起源 8…

使用PAM保障开发运营安全

硬编码凭据和 DevOps 系统中缺乏凭据安全性是组织的巨大漏洞。以明文形式访问凭据的恶意内部人员可以在 IT 中建立和扩展其立足点 基础设施&#xff0c;构成巨大的数据被盗风险。 什么是PAM 特权访问管理 &#xff08;PAM&#xff09; 是指一组 IT 安全管理原则&#xff0c;可…

全球热喷涂设备预计将以超过4.6%的增长率增长!

热喷涂设备是一种用于将涂层材料喷涂在不同基材表面的技术和设备。这些设备使用热源来将涂层材料加热到熔化或半熔化状态&#xff0c;然后将其喷射到基材上&#xff0c;形成涂层。这种涂层技术可以为基材提供防护、增强、修复和装饰等功能。 根据阿谱尔&#xff08;APO&#x…

淘宝商品API使用示例:如何通过调用外部API来获取淘宝商品价格销量主图详情数据

淘宝上的商品信息量非常之大&#xff0c;商品的详情信息也很齐全。如何通过调用外部API来实现批量获取商品价格销量主图详情等信息呢&#xff1f;上周刚好完成了一个完整的淘宝商品采集项目&#xff0c;今天特来分享一下。 接口名称&#xff1a;item_get 请求地址&#xff1a…

【java 入侵 C# 之路】1-入门

感谢 https://www.cnblogs.com/mww-NOTCOPY/p/12213373.html 百度百科 jvm对应clr java se runtime对应 .net framework&#xff0c; jdk对应 .net framework sdk&#xff0c; java对应C# .NET 是开发者平台&#xff0c;它包含开发环境、技术框架、社区论坛、服务支持等&…

fastadmin think-queue supervisor配置

起因是微信支付回调需要同时做发货处理&#xff0c;但是发货接口不能影响,需要队列进行异步处理1. 1.fastadmin 后台购买queue插件(基于think-queue消息队列) 2.代码 2.1 添加文件&#xff1a;application---->extra--->queue.php 内容&#xff1a;我这里用的数据库做…

[机器学习]分类算法系列①:初识概念

目录 1、概念 2、数据集介绍与划分 2.1、数据集的划分 2.2、sklearn数据集介绍 2.2.1、API 2.2.2、分类和回归数据集 分类数据集 回归数据集 返回类型 3、sklearn转换器和估计器 3.1、转换器 三种方法的区别 3.2、估计器 3.2.1、简介 3.2.2、API 3.3、工作流程 …

腾讯云服务器镜像TencentOS Server操作系统详细介绍

腾讯云TencentOS Server镜像是腾讯云推出的Linux操作系统&#xff0c;完全兼容CentOS生态和操作方式&#xff0c;TencentOS Server操作系统为云上运行的应用程序提供稳定、安全和高性能的执行环境&#xff0c;TencentOS可以运行在腾讯云CVM全规格实例上&#xff0c;包括黑石物理…

FTP文件传输服务器

目录 一、FTP协议两种工作模式 二、FTP数据两种传输模式 三、FTP用户分类 四、VSFTP配置案例 4.1匿名开放模式 4.2本地用户模式 4.3虚拟用户模式 五、实验总结 一、FTP协议两种工作模式 主动模式&#xff1a; 1、客户端主动向ftp服务器发送控制连接&#xff0c;三次握手控制连接…

Spark有两种常见的提交方式:client 模式和 cluster 模式对机器 CPU 的影响

Spark有两种常见的提交方式&#xff1a;client 模式和 cluster 模式。这两种方式对机器 CPU 的影响略有不同 &#xff0c;请参考以下说明 Client 模式&#xff1a; 在 Client 模式下&#xff0c;Spark Driver 运行在提交任务的客户端节点上&#xff08;即运行 spark-submit 命…

全新纠错码将量子计算提效10倍!

上周&#xff0c;来自两个研究小组的最新模拟报告称&#xff0c;一类新兴的量子纠错码的效率比目前的“黄金标准”&#xff08;即表面码&#xff09;高出一个数量级。 量子纠错码的工作原理都是将大量容易出错的量子比特转换成更小的“受保护”量子比特&#xff0c;这些量子比特…

软件测试/测试开发丨Selenium 高级定位 CSS

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接&#xff1a;https://ceshiren.com/t/topic/27022 一、CSS选择器概念 CSS拥有自己的语法规则和表达式 CSS通常分为相对定位和绝对定位 CSS常和XPATH一起用于UI自动化测试 二、CSS相对定位使用场景 支…