当前位置: 首页 > news >正文

【JDK动态代理】及【CGLib动态代理】:Java的两种动态代理方式

Java的两种动态代理方式

  • 动态代理是什么?
  • JDK动态代理
  • CGLib动态代理
      • CGLib 底层原理
      • CGLib 实现步骤
  • 两者区别
  • Spring AOP原理--动态代理

动态代理是什么?

    动态代理就是,在程序运行期,创建目标对象的代理对象,并对目标对象中的方法进行功能性增强的一种技术。
    在生成代理对象的过程中,目标对象不变,代理对象中的方法是目标对象方法的增强方法。可以理解为运行期间,对象中方法的动态拦截,在拦截方法的前后执行功能操作。

代理类在程序运行期间,创建的代理对象称之为动态代理对象。

    这种情况下,创建的代理对象,并不是事先在Java代码中定义好的。而是在运行期间,根据我们在动态代理对象中的“指示”,动态生成的。也就是说,你想获取哪个对象的代理,动态代理就会为你动态的生成这个对象的代理对象。动态代理可以对被代理对象的方法进行功能增强。有了动态代理的技术,那么就可以在不修改方法源码的情况下,增强被代理对象的方法的功能,在方法执行前后做任何你想做的事情。

创建代理对象的两个方法:

JDK动态代理

Proxy.newProxyInstance(三个参数);

CGLib动态代理

Enhancer.create(两个参数);

JDK动态代理

🔺基于接口的动态代理
🔺提供者:JDK
🔺使用JDK官方的Proxy类创建代理对象
🔺注意:代理的目标对象必须实现接口

public class LogJdkProxy {/*** 生成对象的代理对象,对被代理对象进行所有方法日志增强* 参数:原始对象* 返回值:被代理的对象* JDK 动态代理*  基于接口的动态代理*  被代理类必须实现接口*  JDK提供的*/public static Object getObject(final Object obj){/*** 创建对象的代理对象* 参数一:类加载器* 参数二:对象的接口* 参数三:调用处理器,代理对象中的方法被调用,都会在执行方法。对所有被代理对象的方法进行拦截*/Object proxyInstance = Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), new InvocationHandler() {public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//方法执行前long startTime = System.currentTimeMillis();Object result = method.invoke(obj, args);//执行方法的调用//方法执行后long endTime = System.currentTimeMillis();SimpleDateFormat sdf = new SimpleDateFormat();System.out.printf(String.format("%s方法执行结束时间:%%s ;方法执行耗时:%%d%%n", method.getName()), sdf.format(endTime), endTime - startTime);return result;}});return proxyInstance;}
}

CGLib动态代理

🔺基于类的动态代理
🔺提供者:第三方 CGLib
🔺使用CGLib的Enhancer类创建代理对象
🔺注意:如果报 asmxxxx 异常,需要导入 asm.jar包

public class LogCGLibProxy {/*** 生成对象的代理对象,对被代理对象进行所有方法日志增强* 参数:原始对象* 返回值:被代理的对象* 使用CGLib创建动态代理对象* 第三方提供的的创建代理对象的方式CGLib* 被代理对象不能用final修饰* 使用的是Enhancer类创建代理对象*/public static Object getObjectByCGLib(final Object obj){/*** 使用CGLib的Enhancer创建代理对象* 参数一:对象的字节码文件* 参数二:方法的拦截器*/Object proxyObj = Enhancer.create(obj.getClass(), new MethodInterceptor() {public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {//方法执行前long startTime = System.currentTimeMillis();Object invokeObject = method.invoke(obj, objects);//执行方法的调用//方法执行后long endTime = System.currentTimeMillis();SimpleDateFormat sdf = new SimpleDateFormat();System.out.printf(String.format("%s方法执行结束时间:%%s ;方法执行耗时:%%d%%n", method.getName()), sdf.format(endTime), endTime - startTime);return invokeObject;}});return proxyObj;}
}

CGLib 底层原理

    通过查看 Enhancer 类源码,最终也是生成动态代理类的字节码,动态代理类继承要被代理的类,然后实现其方法。

    和 JDK Proxy 的实现代码比较类似,都是通过实现代理器的接口,再调用某一个方法完成动态代理的,唯一不同的是,CGLib 在初始化被代理类时,是通过 Enhancer 对象把代理对象设置为被代理类的子类来实现动态代理的。

CGLib 实现步骤

创建一个实现接口 MethodInterceptor 的代理类,重写 intercept 方法;
创建获取被代理类的方法 getInstance(Object target);
获取代理类,通过代理调用方法。

两者区别

JDK Proxy 和 CGLib 的区别主要体现在以下方面:

  1. JDK Proxy 是 Java 语言自带的功能,无需通过加载第三方类实现;
  2. Java 对 JDK Proxy 提供了稳定的支持,并且会持续的升级和更新,Java 8 版本中的 JDK Proxy 性能相比于之前版本提升了很多;
  3. JDK Proxy是通过拦截器加反射的方式实现的; JDK Proxy 只能代理实现接口的类; JDK Proxy 实现和调用起来比较简单;
  4. CGLib 是第三方提供的工具,基于 ASM 实现的,性能比较高;
  5. CGLib 无需通过接口来实现,它是针对类实现代理,主要是对指定的类生成一个子类,它是通过实现子类的方式来完成调用的。

Spring AOP原理–动态代理

1.AOP 思想
基于动态代理思想,对原来目标对象创建代理对象,在不修改原对象代码情况下,通过代理对象调用增强功能的代码,从而对原有业务方法进行增强。

2.AOP 作用
在不修改源代码的情况下,可以增加额外的功能,实现在原有功能基础上的增强。

3.AOP 实现原理
Spring AOP 的有两种实现方式:JDK proxy 和 CGLib 动态代理

当 Bean 实现接口时,Spring 使用 JDK proxy实现。
当 Bean 没有实现接口时,Spring 使用 CGlib 代理实现。

通过配置可以强制使用 CGlib 代理(在 spring 配置中加入 aop:aspectj-autoproxy proxy-target-class=“true”)。

4.AOP 使用场景

  • 记录日志(调用方法后记录日志)
  • 监控性能(统计方法运行时间)
  • 权限控制(调用方法前校验是否有权限)
  • 事务管理(调用方法前开启事务,调用方法后提交关闭事务 )
  • 缓存优化(第一次调用查询数据库,将查询结果放入内存对象,第二次调用,直接从内存对象返回,不需要查询数据库 )

相关文章:

【JDK动态代理】及【CGLib动态代理】:Java的两种动态代理方式

Java的两种动态代理方式动态代理是什么?JDK动态代理CGLib动态代理CGLib 底层原理CGLib 实现步骤两者区别Spring AOP原理--动态代理动态代理是什么? 动态代理就是,在程序运行期,创建目标对象的代理对象,并对目标对象中的…...

《程序员面试金典(第6版)》面试题 04.05. 合法二叉搜索树

题目描述 实现一个函数,检查一棵二叉树是否为二叉搜索树。 示例 1: 输入: 2/ \1 3输出: true 示例 2: 输入: 5/ \1 4/ \3 6输出: false 解释: 输入为: [5,1,4,null,null,3,6]。 根节点的值为 5 ,但是其右子节点值为 4 。 解题思路与代码 使用…...

Nginx 反向代理技术梳理

Nginx 反向代理技术梳理 使用反向代理脑图 域名 A 可以解析找到 CDN 缓存 用户点击 APP 即通过 URL 发送 HTTPS 请求域名会进入阿里云的 DNS 服务器,解析域名会做第一级负载均衡通过 CDN 解析出域名,通过阿里云配置转发到 CDN 缓存服务器 CDN 有数据则直…...

华为OD机试 - 整数编码(Java) | 机试题+算法思路+考点+代码解析 【2023】

整数编码 题目 实现一种整数编码方法,使得待编码的数字越小,编码后所占用的字节数越小。 编码规则如下: 1、编码时7位一组,每个字节的低7位用于存储待编码数字的补码。 2、字节的最高位表示后续是否还有字节,置1表示后面还有更多的字节,置0表示当前字节为最后一个字…...

蓝桥杯冲击01 - 质数篇

目录 前言 一、质数是什么 二、易错点 三、试除法判断是否为质数 四、质数常考三大模型 五、真题练手 前言 距离蓝桥杯还有一个月,高效复习蓝桥杯知识, 质数相关的题目在蓝桥杯中经常出现。例如,2016年蓝桥杯省赛初赛第四题就是要求判…...

【WEB前端进阶之路】 HTML 全路线学习知识点梳理(下)

前言 本文是HTML零基础小白学习系列的第三篇文章,点此阅读 上一篇文章 文章目录前言十五.HTML布局1.使用div元素添加网页布局2.使用table元素添加网页布局十六.HTML表单和输入1.文本域2.密码字段3.单选按钮4.复选框5.提交按钮十七.HTML框架1.iframe语法2.iframe设置…...

MySQL索引分类

1 MySQL索引都有哪些分类按数据结构分类可分为:Btree索引、Hash索引、Full-text索引;按物理存储分类可分为:聚簇索引、二级索引(辅助索引);按字段特性分类可分为:主键索引、普通索引、前缀索引;按字段个数分类可分为&a…...

会声会影2023最新版图文安装详细教程

会声会影2023操作简单,使用便捷,创意十足,新增的分屏功能,轨道透明度,镜头平移等功能,让用户的剪辑过程更加流畅,轻松就能制作出令人惊艳的视频作品。它不仅符合家庭或个人所需的影片剪辑功能&a…...

Java中的反射

类加载器(1)类的加载当我们的程序在运行后,第一次使用某个类的时候,会将此类的class文件读取到内存,并将此类的所有信息存储到一个Class对象中。说明:a.图中的Class对象是指:java.lang.Class类的…...

STM32入门笔记(03):STM32F103C8T6定时器的输入捕获模式和编码器模式(SPL库函数版)

目录1.定时器的输入捕获模式定时器输入捕获实验代码实现程序说明实现思路实现效果知识要点2.定时器的编码器模式定时器编码器实验代码实现实验思路知识要点参考资料先导知识 [1] STM32入门笔记(02):定时器之定时器中断、输入捕获和PWM输出(SPL库函数版)…...

《网络安全》零基础教程-适合小白科普

《网络安全》零基础教程 目录 目录 《网络安全》零基础教程 第1章 网络安全基础 什么是网络安全 常见的网络安全威胁 网络安全的三个基本要素 网络安全的保障措施 第2章 网络攻击类型 病毒、蠕虫、木马、后门 DoS、DDoS攻击 ​​​​​​​SQL注入、XSS攻击 ​​​…...

微信小程序语言与web开发语言的区别

WXML与HTML的区别def:WXML是小程序框架设计的一套标签语言,用来构建小程序页面的结构,作用类似于web开发中的HTML区别:标签名称的不同如HTML中的div,span,img,a分别对应wxml中的view&#xff0c…...

【2022-09-14】米哈游秋招笔试三道编程题

第一题:最短子串 题目描述 米小游拿到了一个字符串,她想截取一个连续子串,使得该子串中包含至少k个连续的“mihoyo”。 你可以帮米小游求出最短的子串长度,以及对应的子串位置吗? 输入描述 第一行输入两个正整数n…...

云监控能力介绍

传统监控介绍 监控系统必要性 监控系统的能力清单 市面上常见商业及开源监控工具集 传统监控体系的不足 云监控介绍 云监控(CloudMonitor)是一项针对云资源和互联网应用进行监控的服务。 云监控为云上用户提供开箱即用的企业级开放型一站式监控解决方…...

HTML 文档类型

<!DOCTYPE> 声明帮助浏览器正确地显示网页。 <!DOCTYPE> 声明 Web 世界中存在许多不同的文档。只有了解文档的类型&#xff0c;浏览器才能正确地显示文档。 HTML 也有多个不同的版本&#xff0c;只有完全明白页面中使用的确切 HTML 版本&#xff0c;浏览器才能完…...

【UML】软件设计说明书 (完结)

目录一. &#x1f981; 前言1.1 编写目的1.2 背景1.3 定义1.4 参考资料二. &#x1f981; 总体设计2.1需求规定2.1.1 系统描述2.1.2 系统用例图2.2 运行环境2.2.1 设备2.2.2 支持软件2.2.3 接口2.2.4 控制2.3 基本设计概念2.4 系统结构三. &#x1f981; 用例分析与设计3.1 用户…...

MATLAB——FFT(快速傅里叶变换)

基础知识 FFT即快速傅里叶变换&#xff0c;利用周期性和可约性&#xff0c;减少了DFT的运算量。常见的有按时间抽取的基2算法&#xff08;DIT-FFT&#xff09;按频率抽取的基2算法&#xff08;DIF-FFT&#xff09;。 1.利用自带函数fft进行快速傅里叶变换 若已知序列x[4,3,2,6…...

力扣-进店却未进行过交易的顾客

大家好&#xff0c;我是空空star&#xff0c;本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目&#xff1a;1581. 进店却未进行过交易的顾客二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行…...

一文解决vscode中借助CMake配置使用Opencv过程中的所有问题

vscode中借助CMake配置使用opencv过程中的问题 vscode编译工程的完整过程 编写好CMakeLists.txtvscode中 ctrlshiftp 选择cmake configurevscode中 ctrlshiftp 选择cmake build CMake问题 1. set OpenCV_FOUND to FALSE so package “OpenCV” is considered to be NOT FOU…...

Golang每日一练(leetDay0004)

10. 正则表达式匹配 Regular Expression Matching 给你一个字符串 s 和一个字符规律 p&#xff0c;请你来实现一个支持 . 和 * 的正则表达式匹配。 . 匹配任意单个字符* 匹配零个或多个前面的那一个元素 所谓匹配&#xff0c;是要涵盖 整个 字符串 s的&#xff0c;而不是部分…...

手机忘记密码解锁的 6 大软件方法

您可能想要解锁手机的原因有很多。也许您正在海外旅行并想使用当地的 SIM 卡&#xff0c;或者您可能刚买了一部二手手机并且需要删除之前所有者的个人数据。您可能想知道如何获得可以免费解锁任何手机的软件。Android 用户可以使用他们的指纹、面部识别或 PIN。您也可以通过快速…...

MySQL数据库的基础语法总结(1)

MySql一.数据库,数据表的基本操作1.数据库的基本操作2. 数据表的基本操作2.1 数据库的数据类型2.1.1 整数类型2.1.2 浮点数类型和定点数类型2.1.3 字符串类型2.1.4 日期与时间类型2.2 数据表的基本操作2.2.1 创建一个数据表2.2.2 查看数据表2.2.3 查看表的基本信息的MySQL指令2…...

Linux之进程创建

本节目录1.fork函数初识2.fork函数返回值3.写时拷贝1.fork函数初识 在Linux中&#xff0c;fork函数是一个非常重要的函数&#xff0c;它从已存在的进程中创建一个新进程。新进程叫做子进程&#xff0c;而原进程叫做父进程。 #include <unistd.h> pid_t fork(void); 返回…...

DCL 管理用户与权限控制

目录 DCL 查询用户 案例 权限控制 案例 DCL DCL英文全称是Data Control Language(数据控制语言)&#xff0c;用来管理数据库用户、控制数据库的访问权限。 查询用户 1、查询用户 select * from mysql.user; 2、创建用户 CREATE USER 用户名主机名 IDENTIFIED BY 密码;…...

如何使用 Python 检测和识别车牌(附 Python 代码)

文章目录创建Python环境如何在您的计算机上安装Tesseract OCR&#xff1f;技术提升磨砺您的Python技能车牌检测与识别技术用途广泛&#xff0c;可以用于道路系统、无票停车场、车辆门禁等。这项技术结合了计算机视觉和人工智能。 本文将使用Python创建一个车牌检测和识别程序。…...

[Python题解] CodeForces 1804 D. Accommodation

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…...

【设计模式】访问者模式

访问者模式 访问者模式被称为是最复杂的设计模式&#xff0c;比较难理解并且使用频率不高。 在 GoF 的《设计模式》⼀书中&#xff0c;访问者者模式(Visitor Design Pattern&#xff09;是这么定义的&#xff1a; Allows for one or more operation to be applied to a set o…...

蓝桥杯刷题冲刺 | 倒计时27天

作者&#xff1a;指针不指南吗 专栏&#xff1a;蓝桥杯倒计时冲刺 &#x1f43e;马上就要蓝桥杯了&#xff0c;最后的这几天尤为重要&#xff0c;不可懈怠哦&#x1f43e; 文章目录1.递增序列2.等差素数列3.七段码4.亲戚5.连通块中点的数量1.递增序列 题目 链接&#xff1a;&am…...

RV1126_python人脸识别Retinaface+MobilefaceNet

RV1126_python人脸识别Retinaface+MobilefaceNet RV1126 具备RKNN 模块支持大部分如Pytorch、MXNet、Caffe、tensorflow、keras、onnx等常见框架,而且量化部署使用RKNN-toolkit非常方便。以下介绍通过RV1126实现的人脸识别过程。 首先人脸识别需要先做人脸检测>>人脸校正…...

HBase---HBase基础语法

HBase基础语法 文章目录HBase基础语法基本操作进入 HBase 客户端命令行查看命名空间查看命名空间下的表创建命名空间创建表查看表描述禁用/启用删除表新增列族删除列族更改列族存储版本的限制put 增加数据get 查看数据get条件查询删除指定列族下的指定列删除指定行全表扫描全表…...

南昌网站小程序开发/seo公司运营

一&#xff1a;依赖关系 1&#xff1a;依赖和血缘关系介绍 rdd.todebugstring&#xff1a;打印血缘关系 rdd.dependencies&#xff1a;打印依赖关系 2&#xff1a;保存血缘关系 3&#xff1a;OneToOne依赖---窄依赖 4&#xff1a;shuffle依赖--宽依赖 新的RDD的一个分区的数据…...

做网站应规避的风险/媒体推广

本文同步发表在我的个人博客中&#xff1a;沧沧凉凉​www.cclliang.com随着前端的飞速发展&#xff0c;现在制作界面时出现了非常多的好看的样式&#xff0c;比如说全屏滚动效果&#xff0c;能够带来很舒服的视觉体验。先来看一下什么是全屏滚动&#xff1a;这是fullpage.js的官…...

网站做百度推广/百度竞价广告投放

给出一个整数N&#xff0c;任务是打印空心半菱形图案。示例&#xff1a;输出&#xff1a;## ## ## ## ## ##输入&#xff1a;7## ## ## ## ## ## ## #### ## ## ## #下半部分&#xff1a;对于下半部分&#xff0c;使用迭代给出一个整数N&#xff0c;任务是打印空心半菱形图案。…...

云南定制化网站建设/seopeix

题意&#xff1a; 用n个木棒凑成数字&#xff0c;和最大是多少 思路&#xff1a; 直接dp写。 #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> #include<iostream>typedef long long ll; using namespace std; const…...

网页及网站建设用什么软件/怎么找专业的营销团队

前言 后端在写对外的API接口时&#xff0c;一般会对参数进行签名来保证接口的安全性&#xff0c;在设计签名算法的时候&#xff0c;主要考虑的是这几个问题&#xff1a; 1. 请求的来源是否合法 2. 请求参数是否被篡改 3. 请求的唯一性 我们的签名加密也是主要针对这几个问题来…...

北京网站设计优刻/东莞网络排名优化

操作系统(Operating System, OS)是指控制和管理整个计算机系统的硬件和软件资源&#xff0c;并合理地组织调度计算机的工作和资源的分配&#xff0c;以提供给用户和其他软件方便的接口和环境的程序集合。计算机操作系统是随着计算机研究和应用的发展逐步形成并发展起来的&#…...