Java开发-面试题-0035-Spring代理方式有哪些

Java开发-面试题-0035-Spring代理方式有哪些

更多内容欢迎关注我(持续更新中,欢迎Star✨)

Github:CodeZeng1998/Java-Developer-Work-Note

(技术)微信公众号:CodeZeng1998

(生活)微信公众号:好锅

其他平台:CodeZeng1998好锅


Spring 中的代理方式主要有两种:JDK 动态代理CGLIB 代理。两者在 Spring AOP 和 事务管理 中都被广泛使用。下面是对这两种代理方式的详细说明:


1. JDK 动态代理

概念:

JDK 动态代理是基于 Java 的 java.lang.reflect.Proxy 类和 InvocationHandler 接口来实现的。它只针对接口进行代理,因此代理类必须实现某个接口。


工作原理:
  • JDK 动态代理通过在运行时生成一个代理类,该代理类实现了目标对象所实现的接口。
  • 当代理对象调用接口中的方法时,代理类会拦截该方法调用,并将其交由 InvocationHandler 处理。
  • InvocationHandler 中,开发者可以定义代理逻辑,例如方法执行前后增强、权限检查、事务管理等。

特点:
  • 只能代理实现了接口的类。
  • 代理是基于接口调用的,因此目标对象必须实现一个或多个接口。
  • 代理类是在运行时动态生成的,无需在编译时定义。

使用场景:

Spring 会优先选择使用 JDK 动态代理,前提是目标类有实现接口,比如通过 AOP 进行事务控制时,常见的 service 层使用的是接口。


示例代码:
public interface Service {void perform();
}public class ServiceImpl implements Service {@Overridepublic void perform() {System.out.println("Performing service operation...");}
}public class ServiceInvocationHandler implements InvocationHandler {private final Object target;public ServiceInvocationHandler(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("Before method execution...");Object result = method.invoke(target, args);System.out.println("After method execution...");return result;}
}public class Main {public static void main(String[] args) {Service service = new ServiceImpl();Service proxy = (Service) Proxy.newProxyInstance(service.getClass().getClassLoader(),service.getClass().getInterfaces(),new ServiceInvocationHandler(service));proxy.perform();}
}

2. CGLIB 代理

概念:

CGLIB(Code Generation Library)代理是基于底层字节码生成的代理技术。它通过扩展(继承)目标类并在运行时生成代理类来实现方法拦截。CGLIB 代理不需要目标对象实现接口,因此它可以代理任何类。


工作原理:
  • CGLIB 使用 ASM 字节码操作框架在运行时生成目标类的子类,并重写目标类中的方法来实现代理。
  • 当代理类调用被代理类的方法时,代理类通过方法拦截器(MethodInterceptor)来增强方法逻辑。

特点:
  • 能够代理没有实现接口的类,即可以代理普通的类。
  • 代理是基于子类的,代理类实际上是目标类的子类,因此不能代理 final 类以及 final 方法。
  • 性能通常比 JDK 动态代理稍高,但由于生成类字节码的开销,代理类的生成较为复杂。

使用场景:

当目标类没有实现接口时,Spring 会选择使用 CGLIB 代理,例如在纯 POJO 类或者只实现抽象类的情况下,事务管理和 AOP 增强都需要使用 CGLIB 来代理。


示例代码:
public class Service {public void perform() {System.out.println("Performing service operation...");}
}public class ServiceMethodInterceptor implements MethodInterceptor {@Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {System.out.println("Before method execution...");Object result = proxy.invokeSuper(obj, args);System.out.println("After method execution...");return result;}
}public class Main {public static void main(String[] args) {Enhancer enhancer = new Enhancer();enhancer.setSuperclass(Service.class);enhancer.setCallback(new ServiceMethodInterceptor());Service proxy = (Service) enhancer.create();proxy.perform();}
}

3. Spring 中的代理选择机制

Spring 默认优先使用 JDK 动态代理,但如果目标对象没有实现任何接口,它会自动切换到 CGLIB 代理。具体的选择机制是:

  • 如果目标对象实现了接口,Spring 会使用 JDK 动态代理。
  • 如果目标对象没有实现接口,Spring 会使用 CGLIB 代理。

可以通过 @EnableAspectJAutoProxy(proxyTargetClass = true) 强制 Spring 使用 CGLIB 代理,即使目标类实现了接口。


4. 代理方式的选择

  • JDK 动态代理:适合目标对象实现了接口的情况。优点是代理类轻量、生成简单,缺点是只能代理接口。
  • CGLIB 代理:适合目标对象没有实现接口或希望通过继承的方式进行代理的情况。优点是代理范围广,能够代理任何类,缺点是不能代理 final 类或 final 方法,生成代理类较复杂。

总结来看,Spring 的代理机制在灵活性和性能上都非常适合于不同的业务场景,而 JDK 动态代理和 CGLIB 各有其适用场景,开发者可以根据需要选择合适的代理方式。


以上就是本文相关的所有内容了,如果发现有误欢迎评论指正,更多内容欢迎各位关注。

在这里插入图片描述

上图是由 Pic 生成的

关键词:Iron Man


更多内容欢迎关注我(持续更新中,欢迎Star✨)

Github:CodeZeng1998/Java-Developer-Work-Note

(技术)微信公众号:CodeZeng1998

(生活)微信公众号:好锅

其他平台:CodeZeng1998好锅

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

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

相关文章

【Python报错已解决】SyntaxError invalid syntax

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 专栏介绍 在软件开发和日常使用中,BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

怎么解除BitLocker对磁盘的加密?

BitLocker是一种Windows操作系统内置的加密功能,用于保护用户的数据安全。它通过对整个磁盘进行加密,防止数据被未经授权的用户访问。BitLocker主要用于保护笔记本电脑和台式机中的重要数据,尤其是在设备丢失或被盗的情况下。怎么解除BitLock…

【Redis入门到精通二】Redis核心数据类型(String,Hash)详解

目录 Redis数据类型 1.String类型 (1)常见命令 (2)内部编码 2.Hash类型 (1)常见命令 (2)内部编码 Redis数据类型 查阅Redis官方文档可知,Redis提供给用户的核心数据…

Redhat 7,8,9系(复刻系列) 一键部署Oracle19c rpm

Oracle19c前言 Oracle 19c 是甲骨文公司推出的一款企业级关系数据库管理系统,它带来了许多新的功能和改进,使得数据库管理更加高效、安全和可靠。以下是关于 Oracle 19c 的详细介绍: 主要新特性 多租户架构:支持多租户架构,允许多个独立的数据库实例在同一个物理服务器上…

鸿蒙开发之ArkUI 界面篇 十四 个人中心导航界面

鸿蒙要实现如图效果,代码简洁到令人难以置信: 整体布局是水平方向的,用row容器,左边是Image加载图标,中间是Text。右边也是Image加载图片,主轴子组件之间的距离用justifyContent(FlexAlign.SpaceBetween)&a…

MySQL 中的锁定粒度:理解与应用

在 MySQL 数据库的使用中,锁定粒度是一个至关重要的概念。它决定了数据库在并发控制中锁定的范围和程度,对数据库的性能和并发能力有着深远的影响。今天,我们就来深入了解一下 MySQL 中的锁定粒度是什么意思,并通过实际案例来更好…

C++自动寻径算法

测试 #include <iostream> #include "source/AStar.hpp"int main() {AStar::Generator generator;generator.setWorldSize({25, 25});generator.setHeuristic(AStar::Heuristic::euclidean);generator.setDiagonalMovement(true);generator.addCollision({1, …

如何搭建客户服务知识库?五项基本方法让你业务增长100%

在竞争激烈的市场环境中&#xff0c;优质的客户服务已成为企业脱颖而出的关键。而一个高效、全面的客户服务知识库&#xff0c;不仅能够提升客户满意度&#xff0c;还能显著降低客服团队的工作负担&#xff0c;促进业务的稳健增长。本文将介绍五项基本方法&#xff0c;帮助你搭…

头部姿态估计代码+教程

前言 头部姿态估计是计算机视觉中的一个具有挑战性的问题&#xff0c;因为它需要完成多个步骤。首先&#xff0c;我们需要在画面中定位人脸&#xff0c;然后识别出各种面部特征点。如今&#xff0c;当人脸正对摄像头时&#xff0c;识别人脸似乎是一个简单的任务。但问题在于&am…

使用sqoop将mysql数据导入到hive报错ClassNotFoundException、Zero date value prohibited、.MapRedTask等错误

第一个错误&#xff1a; Caused by: java.lang.ClassNotFoundException: org.apache.commons.lang.StringEscapeUtilsat java.net.URLClassLoader.findClass(URLClassLoader.java:381)at java.lang.ClassLoader.loadClass(ClassLoader.java:424)at sun.misc.Launcher$AppClass…

萌啦数据行业数据在哪看,萌啦ozon行业数据怎么看

在跨境电商的浪潮中&#xff0c;数据已成为商家决策的重要基石。萌啦Ozon数据行业分析板块&#xff0c;作为连接商家与市场动态的桥梁&#xff0c;为商家提供了丰富的行业洞察与精准的市场指导。本文将带您深入探索萌啦Ozon数据行业分析板块的功能&#xff0c;揭秘如何在这片数…

redis分布式锁(看门枸机制)

分布式锁确保在同一时间只有一个节点能获得对共享资源的独占访问权限&#xff0c;从而解决并发访问问题。 Redisson锁(简称看门狗) 它可以实现锁的延长&#xff0c;确保某个线程执行完才能让其他线程进行抢锁操作 引入看门狗机制后 如何使用&#xff1f; 1、引入依赖包 <…

搜索引擎onesearch3实现解释和升级到Elasticsearch v8系列(四)-搜索

搜索 搜索内容比较多&#xff0c;onesearch分成两部分&#xff0c;第一部分&#xff0c;Query构建&#xff0c;其中包括搜索词设置&#xff0c;设置返回字段&#xff0c;filter&#xff0c;高亮&#xff1b;第二部分分页和排序。第一部分是映射引擎负责&#xff0c;映射通用表…

MedPrompt:基于提示工程的医学诊断准确率优化方法

Medprompt&#xff1a;基于提示工程的医学诊断准确率优化方法 秒懂大纲解法拆解MedPrompt 提示词全流程分析总结创意视角 论文&#xff1a;Can Generalist Foundation Models Outcompete Special-Purpose Tuning? Case Study in Medicine 秒懂大纲 ├── 1 研究背景【描述背…

兴业小知识|法拍房你不知道的省钱小技巧~划走可就亏大了

如果说二手房市场是买卖双方之间的博弈&#xff0c;那法拍房市场则是纯买方的心理游戏。 在法拍房竞拍过程中&#xff0c;有人稳如泰山&#xff0c;有人坐立不安&#xff0c;每一次的出价都是对相互底线的一番试探。 有激进竞拍&#xff0c;拍出天价的&#xff0c;有一举夺魁…

使用宝塔部署项目在win上

项目部署 注意&#xff1a; 前后端部署项目&#xff0c;需要两个域名&#xff08;二级域名&#xff0c;就是主域名结尾的域名&#xff0c;需要在主域名下添加就可以了&#xff09;&#xff0c;前端一个&#xff0c;后端一个 思路&#xff1a;访问域名就会浏览器会加载前端的代…

手把手教你-MAC笔记本安装Pytorch环境

MAC笔记安装Pytorch 环境安装 1. 安装brew 方法1 参考&#xff1a; https://www.jianshu.com/p/e0471aa6672d?utm_campaignhugo 使用中科大镜像加速访问&#xff1a; /usr/bin/ruby -e "$(curl -fsSL https://cdn.jsdelivr.net/gh/ineo6/homebrew-install/install)&qu…

OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【时间管理】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 子系统开发内核 轻量系统内核&#xff08;LiteOS-M&#xff09; 轻量系统内核&#…

百望云生态伙伴大会在北京、深圳、昆明三地举办,携手共赢数字化未来!

伴随着金税四期数电票、乐企加速扩围&#xff0c;激发了企业大量的财税数字化转型的需求&#xff0c;为财税服务市场注入了前所有未有的活力。2024年7月9日&#xff0c;百望云成功登陆港交所&#xff0c;成为港股“电子发票第一股”&#xff0c;加码财税业务布局&#xff0c;纵…

【C++ Primer Plus习题】16.10

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: #include <iostream> #include <string> #include <…