[Java]轻松掌握JDK和CGlib代理的使用技巧,让你的Java程序性能更卓越!

JDK代理与CGlib代理

是什么

JDK代理:JDK代理是一种基于接口的动态代理,它实现了被代理对象所实现的接口,可以在运行时通过反射的方式来生成代理对象。

CGlib代理:CGlib代理是一种基于类的动态代理,它通过生成被代理对象的子类来实现代理。因此,被代理对象不需要实现接口。

为什么

使用代理模式的主要目的是为了在不修改原始类的前提下,为其添加一些额外的功能。在实际开发中,我们经常需要在业务逻辑执行前后,增加一些日志记录、权限校验、事务管理等功能,这些功能与业务逻辑关系不大,但是又必须加入到业务逻辑中。这时就可以使用代理模式来解决这个问题。

怎么用

JDK代理
  1. 定义一个接口:
public interface UserService {void save(User user);
}
  1. 实现接口:
public class UserServiceImpl implements UserService {@Overridepublic void save(User user) {System.out.println("保存用户信息:" + user);}
}
  1. 创建代理类,实现InvocationHandler接口:
public class UserServiceProxy implements InvocationHandler {// 被代理对象private Object target;public UserServiceProxy(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("执行方法前...");Object result = method.invoke(target, args);System.out.println("执行方法后...");return result;}
}
  1. 测试:
public static void main(String[] args) {UserServiceImpl userService = new UserServiceImpl();UserService proxy = (UserService) Proxy.newProxyInstance(userService.getClass().getClassLoader(),userService.getClass().getInterfaces(),new UserServiceProxy(userService));proxy.save(new User("Tom", 20));
}

输出结果:

执行方法前...
保存用户信息:User{name='Tom', age=20}
执行方法后...
CGlib代理
  1. 定义一个类:
public class UserService {public void save(User user) {System.out.println("保存用户信息:" + user);}
}
  1. 创建代理类,继承MethodInterceptor接口:
public class UserServiceProxy implements MethodInterceptor {// 被代理对象private Object target;public UserServiceProxy(Object target) {this.target = target;}@Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {System.out.println("执行方法前...");Object result = method.invoke(target, args);System.out.println("执行方法后...");return result;}
}
  1. 测试:
public static void main(String[] args) {Enhancer enhancer = new Enhancer();enhancer.setSuperclass(UserService.class);enhancer.setCallback(new UserServiceProxy(new UserService()));UserService proxy = (UserService) enhancer.create();proxy.save(new User("Tom", 20));
}

输出结果:

执行方法前...
保存用户信息:User{name='Tom', age=20}
执行方法后...

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

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

相关文章

中国人工智能

随着科技的飞速发展,人工智能(AI)作为一项前沿技术在各个领域展现出了强大的潜力。本文将探讨中国人工智能的历史、现状,并展望其未来发展。 人工智能的起源与历史 人工智能的概念最早诞生于1956年的美国达特茅斯学院的夏季研讨会…

【数据库】数据库元素的层次,树形结构的下的多粒度加锁,以及幻象的正确处理

数据库元素的层次 ​专栏内容: 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏会定期…

Bootstrap 5 中文文档 (简体中文)

Bootstrap 5 中文文档 (简体中文): Bootstrap 4 繁體中文手冊 (中文(繁體))Bootstrap 5 繁體中文手冊 (中文(繁體))Bootstrap 5 中文文档 (Simplified Chinese)

linux内核bio子系统学习记录一:

bio子系统学习一: 主要源码目录 :block/bio.c include/linux/bio.h 内核版本:4.19.1 这部分先总结下bio子系统的初始化部分,后续再总结bio的申请以及释放,还有其它api的使用等介绍。 bio的涉及到频繁的内存申请以及释放&#x…

(学习笔记)Xposed模块编写(一)

前提:需要已经安装Xposed Installer 1. 新建一个AS项目 并把MainActvity和activity_main.xml这两个文件删掉,然后在AndriodManifest.xml中去掉这个Activity的声明 2. 在settings.gralde文件中加上阿里云的仓库地址,否则Xposed依赖无法下载 m…

【llm使用】ChatGLM3-6B Transformers部署调用

文章目录 环境准备模型下载代码准备部署 说明:本文转自国内开源组织datawhale的repo: self-llm 环境准备 在autodl平台中租一个3090等24G显存的显卡机器,如下图所示镜像选择PyTorch–>2.0.0–>3.8(ubuntu20.04)–>11.8 接下来打…

windows 系统读取 Linux Ext 分区硬盘

windows 系统读取 Linux Ext 分区硬盘 起因是需要处理一些在硬盘中的数据,硬盘插到我的电脑上后无法读盘,在 Windows 存储管理器中查看显示未分配,需要格式化,但是在 Ubuntu 系统的电脑中可以正常识别,试验了几次后发…

.NET8构建统计Extreme Optimization Numerical Libraries

为 .NET 8 构建统计应用程序 Extreme Optimization Numerical Libraries for .NET V8.1.22 添加了对 .NET 8 的支持,使您可以使用最新版本的 Microsoft 平台。 Extreme Optimization Numerical Libraries for .NET 是通用数学和统计类的集合,为技术和统计…

关于清空ant.design 中表单内容的方法

关于清空ant.design 中表单内容的方法 其实就两个方法具体怎么清除一个一个试试就知道了 表单有两个可能的属性: formformRef 可以用他们绑定两个用法在代码部分定义: form useRef()form Form.useForm() 清空的方法: form.current?…

【Linux】第二十六站:软硬链接

文章目录 一、软链接二、硬链接三、ln命令四、该如何理解硬链接?五、如何理解软链接六、为什么要用软硬链接1.软链接的应用场景2.硬链接的应用场景 一、软链接 如下所示,我们创建一个文件以后,然后执行下面的指令 ln -s file.txt soft-link…

C++模拟实现unordered_map和unordered_set

目录 1.了解哈希表 1.哈希表 1.他的实现原理就是: ​编辑 2.写单个数据的类型(这边先模拟map的kv类型,后面会再一起改,这边先一步步的先简单实现他) 3.封装整个类: 4.哈希表中存储string 2.哈…

前后端分离部署https

引用:https://blog.csdn.net/weixin_35676679/article/details/127841598 前后端部署,,一般用的是nginx和java,,, 下载SSL证书: java配置https 将证书配置到springboot中 server:port: 544…

线程...

文章目录 1.Linux中线程该如何理解2.重新定义线程 和 进程3.重谈地址空间 --- 第四讲4.Linux线程周边的概念 线程:是进程内的一个执行分支。线程的执行粒度,要比进程要细 很多教材喜欢这么说,这只是一个线程的特征之一,来解释线程。 1.Linux中线程该如何…

基于51单片机的交通灯_紧急开关+黄灯倒计时+可调时间

51单片机交通灯_紧急开关黄灯倒计时可调时间 开题报告系统硬件设计主控制器选择系统硬件结构图时钟及复位电路指示灯及倒计时模块 倒计时模块:程序软件主流程框架main函数 设计报告资料清单资料下载链接 基于51单片机交通灯_紧急开关黄灯倒计时可调时间 仿真图prote…

题目:神奇的进制

解题思路: 用电脑自带的计算器,切换到程序员模式。里面有进制转换功能。 由题目,要求严格递增且都为字母,还要大于2023,则数字16进制为ABC。

【STM32】电机驱动

一、电机分类 二、直流电机的分类 1.有刷电机 2.无刷电机 3.直流减速电机 三、H桥电路 正向旋转 驱动Q1和Q4 反向旋转 驱动Q2和Q3 四、MC3386电机驱动芯片 1.基本原理图 1)前进/后退:IN1和IN2的电平顺序决定电机的正反转 2)调节速度&#…

ARM Cortex-A、Cortex-M和Cortex-R简介

ARM Cortex-A,Cortex-M和Cortex-R是ARM处理器系列的不同产品线,针对不同的应用场景和要求进行了优化。以下是它们之间的主要区别: 1. 应用场景:Cortex-A系列处理器主要用于高性能计算设备,例如智能手机、平板电脑、个…

Redis对象

Redis根据基本数据结构构建了自己的一套对象系统。主要包括字符串对象、列表对象、哈希对象、集合对象和有序集合对象 同时不同的对象都有属于自己的一些特定的redis指令集,而且每种对象也包括多种编码类型,和实现方式。 Redis对象结构 struct redisOb…

Linux 防火墙

目录 安全技术 防火墙的分类 按保护范围划分 按实现方式划分 按网络协议划分 应用层防火墙(7层) 防火墙的工作原理 linux防火墙的基本认识 防火墙工具介绍 1.iptables 2.firewalld 3.nftables 安全技术 —— 入侵检测系统(Intru…

Python 文件错误 SyntaxError: Non-Ascii Character \xe2

此错误表明您正在代码中写入非 ASCII 字符。 在编译时,解释器感到困惑并抛出 SyntaxError: Non-ASCII character ‘\xe2’ 。 ASCII 字符使用与 UTF-8 的前 128 个字符相同的编码,因此 ASCII 文本与 UTF-8 兼容。 首先,您必须了解 ASCII 字符…