Spring中CGLib代理模式

浅谈Spring中JDK动态代理和CGLIB动态代理 阅读详情

 在spring中,有两种动态代理模式,一种是JDK中的动态代理,另一种就是CGLib代理。

1. 什么是CGLib?
 CGLib(Code Generation Library)是一个开源项目。是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类接口。Hibernate支持它来实现PO(Persistent Object 持久化对象)字节码的动态生成。Hibernate生成持久化类的javassist。
 CGLib生成代理机制:采用非常底层字节码技术,生成了一个真实对象的子类,解决无接口代理问题。

2. CGLib的jar包
 现在用CGLib的开发,可以不用直接导入CGLib的jar包,因为在spring的基本包的核心包spring-core-3.2.0.RELEASE.jar中已经集成了CGLib的jar包。

3. CGlib生成动态代理实例
Product类代码(真实对象):

public class ProductDao {
    public void add() {
        System.out.println("添加商品。。。。。。。");
    }

    public void update() {
        System.out.println("修改商品。。。。。。。");
    }
}

CGLib生成代理代码(代理对象):

//使用CGLib生成代理对象。
public class CGLibProxy implements MethodInterceptor{
    private ProductDao productDao;

    public CGLibProxy(ProductDao productDao) {
        super();
        this.productDao = productDao;
    }
    public ProductDao createProxy(){
        //使用CGLib生成代理。
        //1.创建核心类。
        Enhancer enhancer = new Enhancer();
        //2.为其设置父类。
        enhancer.setSuperclass(productDao.getClass());
        //3.设置回调。
        enhancer.setCallback(this);
        //4.创建代理。
        return (ProductDao) enhancer.create();
    }
    /**
     * @param proxy CGlib根据指定父类生成的代理对象
     * @param method 拦截的方法
     * @param args 拦截方法的参数数组
     * @param methodProxy 方法的代理对象,用于执行父类的方法 
    */
    public Object intercept(Object proxy, Method method, Object[] args,
            MethodProxy methodProxy) throws Throwable {
        if("add".equals(method.getName())){
            System.out.println("日志记录==========================");
            Object obj = methodProxy.invokeSuper(proxy, args);
            return obj;
        }
        return methodProxy.invokeSuper(proxy, args);
    }
}

测试代码(调用代理):

public void demo(){
        ProductDao productDao = new ProductDao();
        ProductDao proxy = new CGLibProxy(productDao).createProxy();
        proxy.add();
        proxy.update();
    }

运行结果:

日志记录==========================
添加商品。。。。。。。
修改商品。。。。。。。
Java基础 代理模式:静态、动态、cglib;及 spring 中 动态、cglib 两种方式的示例 代理模式,也称委托模式,是结构型设计模式之一;代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改代理目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。 阅读详情

相关推荐

Spring : 静态代理模式和JDK、CGLIB动态代理

1.美图 2.概述 为了更好的分析分析Spring的另一个核心功能AOP,需要先温习一下动态代理的知识,如果对java的动态代理无所了解的话,那么对AOP源码的分析就无从谈起。代理模式可分为静态代理和动态代理两种。而动态代理又有JDK、CGLIB动态代理。下面我们逐步分析这几种代理。 ...

九师兄 546

springboot2.x默认采用cglib代理,以及配置jdk动态代理的方法

众所周知,springboot开启aop需要在启动类加上注解 @EnableAspectJAutoProxy ,但开发过程中发现即使没有加此注解,bean还是被代理过,而且是Cglib代理对象,此时在启动类加上@EnableAspectJAutoProxy(proxyTargetClass = false)关闭cglib代理,但发现 proxyTargetClass 参数设置无效,生成的代理bean仍为cglib代理,跟踪源码发现在处理aop过程中,aop入口类@EnableAspectJAutoProxy

weixin_38206491的博客 2229

Ubuntu升级遇到grub-efi-amd64-signed安装失败?3步搞定这个烦人错误

本文深度解析Ubuntu系统升级时grub-efi-amd64-signed安装失败并提示“cannot find EFI directory”错误的根本原因。该错误通常由EFI系统分区挂载异常、BIOS/UEFI引导模式不匹配或dpkg包状态死锁导致。文章提供了三步精准修复流程:首先检查并修复ESP分区挂载,其次处理dpkg依赖问题,最后针对传统BIOS系统提供适配方案,帮助用户安全彻底地解决这一常见升级难题。

r7s8t的博客 398

SpringBoot(四)——SpringBoot 异常处理、配置拦截器、自定义banner、三种跨域处理、AOP 的应用、文件上传、整合 Web 基础组件、整合 JdbcTemplate和多数据源

SpringBoot(四)——SpringBoot 异常处理、配置拦截器、自定义banner、三种跨域处理、AOP 的应用、文件上传、整合 Web 基础组件、整合 JdbcTemplate和多数据源

qq_41824825的博客 804

读书笔记:深度学习入门-基于python的理论与实现(俗称鱼书)

终于从头到尾把鱼书看完啦,真的是非常入门,非常查漏补缺,对新手很友好,对有一定基础的人也非常不错。看完不复习等于没看,所以今天开始复盘,顺便写这篇读书笔记。希望分享给没看过这本书或者看过这本书的同僚们参考,欢迎大家指教。我将从第三章神经网络开始复习,前两章内容书里已经非常基础and清楚了。(会持续更新滴).........

博客而已 1万+

OBD诊断协议:OBDⅡ (SAE J1979) 和 OBDonUDS (SAE J1979-2) 和ZEV OBD技术架构的详细对比

摘要:文章对比了2025年最新OBD技术标准(SAEJ1979系列)的三大架构:传统OBD-II(已淘汰)、OBDonUDS(燃油/混动车)和ZEVOBD(新能源车)。核心发现:1)OBDonUDS与ZEVOBD共享UDS协议栈和DoIP通信标准,仅应用层数据(DID/DTC)不同;2)物理层统一为CAN+以太网,支持远程诊断和OTA;3)诊断工具需同时兼容J1979-2/3数据库。技术演进呈现"协议统一化、数据专用化"趋势,2027年后所有新车将强制采用新标准。

m0_56482679的博客 2388

SpringAop内部调用时不经过代理类解决方案

SpringAop AOP代理织入时期 编译时织入 - aspectj框架 类加载时织入 - aspectj框架 运行时织入 - spring-aop 动态代理方式 JDK - 被代理对象必须需要实现接口 CGLIB - 采用继承被代理对象方式实现代理功能 解决SpringAop内部调用时不经过代理类(而是通过this) 方案一 通过编译时织入或者类加载时织入代码 方案二 通过当前代理类调...

luckyman98的博客 1110

Modelsim10.5_se安装(Win11)

modelsim是Mentor公司开发的优秀的HDL语言仿真软件。它能提供友好的仿真环境,采用单内核支持VHDL和Verilog混合仿真的仿真器。它采用直接优化的编译技术、Tcl/Tk技术和单一内核仿真技术,编译仿真速度快且编译的代码与平台无关。

m0_51186267的博客 9910

springboot学习(六十四) 解决springboot中aop使用了cglib代理导致注解丢失引发的问题

springboot中在使用aop时,会使用动态代理,如果此时再获取被代理的类上的注解会导致获取失败。 比如使用websocket时候如果在方法上使用aop就会出现问题。 1、问题复现 下面websocket类中使用了@ServerEndpoint注解,并在@OnOpen方法上添加了一个自定义注解@LogRecord,这个自定义注解会使用aop,从而会复现问题。 package com.iscas.biz.config; import com.iscas.biz.config.log.LogReco.

文若书生的专栏 3012

FM20S用户手册--Linux系统启动卡制作及系统固化

评估板出厂时,默认提供一张配套的Micro SD卡,此卡为可正常使用的Linux系统 启动卡。评估板断电,将Linux系统启动卡插入评估板Micro SD卡槽,根据评估底板丝印将 启动方式选择拨码开关拨为1010(1-4).此档位为Micro SD启动模式。使用Linux 系统启动卡启动系统时,将使用此目录的BOOTbn文件启动FSBL和U-Boot。Linux系统启动卡制作时,已将固化系统的脚本文件mkemmcboot.sh拷贝至Linux系 统启动卡文件系统的"/opt/tools/"目录下。

创龙,嵌入式一体化解决方案商 302

【YOLO目标检测全栈实战】68 模型量化:从FP32到INT8,精度不掉,速度翻倍

摘要: 模型量化能显著提升推理速度(如YOLOv5s帧率从15FPS提升至38FPS),但需避免三大误区:1)校准集需覆盖实际场景,而非随机采样;2)敏感层(如检测头)应保留FP32精度;3)预处理必须与量化前后一致。通过混合精度量化(Backbone用INT8,检测头用FP32)和逐通道量化,可实现<1%的mAP损失。关键步骤包括校准数据准备、量化感知训练及逐层精度评估,最终在Jetson Nano等边缘设备上实现速度与精度的平衡。

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 146

Spring AOP原理深度解析:代理模式、JDK动态代理与CGLIB

本文深入解析Spring AOP的实现原理与技术选型。首先介绍了AOP的核心概念与设计理念,通过对比传统OOP与AOP的代码结构,展示AOP在解耦横切关注点方面的优势。随后详细剖析了JDK动态代理与CGLIB字节码增强两种代理机制,包括实现原理、性能对比和适用场景。在Spring AOP实现部分,重点分析了拦截器链的设计和执行流程,以及不同通知类型的执行顺序。文章还提供了企业级应用场景下的实战案例,如分布式链路追踪和多数据源事务管理,并针对常见问题给出了解决方案。最后从性能优化、技术选型和未来发展趋势等维度

七夜zippoe的博客 1672

手把手完整实现STM32+ESP8266+MQTT+阿里云服务器+手机APP应用——第一节—阿里云物联网平台配置+IoTStudio界面绘制+MQTT.fx模拟MQTT客户端与使用AT命令发布订阅消息

通过MQTT.fx模拟连接以及通过CH340串口连接ESP8266发送AT命令,实现阿里云物联网平台发送数据同时接收数据,IOT studio界面显示数据。具体来说:使用ESP8266(本系列使用了ESP8266-ESP01/01S以及正点原子的ATK-ESP8266) 来连接网络,获取设备数据发送到阿里云物联网平台并显示数据,通过IOT studio界面显示数据并发送命令控制设备。本系列使用的主控芯片是STM32F103系列,当然也可以使用其他系列单片机都可以实现,思路都是一样的。同时本系列有手机APP源

嵌入式阿齐Archie 5万+

KKB : Spring AOP的代理模式:Jdk + Cglib

一、基于JDK实现的springAOP代理模式:针对于接口 UserDaoImpl的test1方法只简单的输出了UserDaoImpl,我们想的是在输出前后加上日志,希望记录上执行的日期操作人等等。 编写的Dai类即是想实现的目标效果,Dai继承于InvocationHandler,在invoke方法里包含了需要的日志功能 编写的测试类 上面的newProxyInstance()方法,从上面例子我们可以知道,根据一个对象可以得到类加载器(ClassLoader)和 接口...

awodwde的博客 120

PCL 计算点云AABB包围盒的体积【2026最新版】

AABB包围盒又称了 轴对齐包围盒,是点云包围盒里最简单的一种,其计算方法也极其简单。获取包围盒之后,根据包围盒的长宽高进行体积计算即可!博客长期更新,本文最近一次更新时间为:2026年5月3日。

点云侠的博客 2295

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【Spring】代理模式 与 Spring中的jdk动态代理和cglib动态代理

代理模式: 代理模式的定义:代理模式(Proxy Pattern)是程序设计中的一种设计模式。为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。 代理模式的组成: 1、抽象角色:通过接口或抽象类声明真实角色实现的业务方法。 2、真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色...

景谦Nice的博客 455

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Spring AOP代理模式:JDK动态代理 vs CGLIB性能对比(实测数据)

💡JDK代理适合接口明确、性能敏感的场景,创建快但调用稍慢💡CGLIB代理功能更强大但资源消耗更高,适合复杂继承关系💡实际性能差异通常在10-30%之间,但具体场景需要实测💡代理模式选择是性能与功能的权衡,需要根据业务特点决定。

持续输出Java相关知识 849

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

代理模式

代理模式(Proxy Pattern) 是只为其他对香提供一种代理,以控制这个控制这个对象的访问, 代理对象在客服端与目标对象之前起到中介作用 他是属于结构设计模式 动态代理 Proxy.newProxyInstance(aClass.getClassLoader(),aClass.getInterfaces(),this); 每一个动态代理类都必须要实现InvocationHandler这个接口,并且每个代理类的实例都关联到了一个handler,当我们通过代理对象调用一个方法的时候,这个方法的调用就

weixin_43286232的博客 169

【Spring框架】Spring底层的两种代理模式:JDK动态代理与cglib动态代理的区别和实现

代理设计模式 将核心功能与辅助功能(事务、日志、性能监控代码)分离,达到核心业务功能更纯粹、辅助业务功能可复用。 Spring中的AOP代理,可以是JDK动态代理,也可以是CGLIB代理 JDK动态代理 JDK动态代理是通过java.lang.reflect.Proxy类来实现的,我们可以调用Proxy类的newProxyInstance()方法来创建代理对象 1、创建Service层的接口和实现类,实现两个方法 public interface UserService { int insertU

她的坏机器人 711

代理模式(静态代理、JDK动态代理、CGLib动态代理、Spring AOP)

定义:为其他对象提供一种代理,以控制对这个对象的访问,代理对象在客户端和目标对象之间起到中介的作用; 类型:结构型; 适用场景: 保护代理对象; 增强代理对象; 优点: 将代理对象与真实被调用的目标对象分离; 一定程度上降低了系统耦合度,扩展性好; 保护目标对象; 增强目标对象; 缺点: 代理模式会造成系统设计中目标类增加; 在客户端和目标对象之间增加一个代理对象,相对会造成请求处理速度...

ていひんのブログ 292

代理模式 jdk代理 cglib代理 spring aop代理

这里代理原理就不讲了因为基本估计你自己写代码是用不到的,除非你自己要整个框架来替代spring 。主要讲讲有哪些代理模式,以及spring的Aop动态代理规则。先讲结果,Aop的最大意义是:在不改变原来代码的前提下,也不对源代码做任何协议接口要求。而实现了类似插件的方式,来修改源代码,给源代码插入新的执行代码。有了这个,你可以实现自定义注解。实现通用方法打印日志。 哪究竟啥是jdk代理呢,很简单...

qq_30409323的博客 201

Spring代理模式实战:从JDK/CGLIB动态代理到AOP原理与避坑指南

代理模式是面向对象编程中一种结构型设计模式,它通过提供一个代理对象来控制对原始对象的访问。其核心原理是在客户端和目标对象之间引入一个间接层,这个代理层可以在调用真实对象前后执行额外的逻辑,如权限控制、日志记录、性能监控等。这一机制在Java生态中具有极高的技术价值,它实现了功能增强与业务逻辑的解耦,是AOP(面向切面编程)的基石。在实际应用场景中,代理模式广泛应用于Spring框架的声明式事务管理、安全控制、缓存和异步处理等模块。本文聚焦于Spring 5中的代理模式实现,深入剖析JDK动态代理与CGLIB

weixin_34094282的博客 330

【Spring框架】[2/3]JDK代理模式,CGLIB,AOP 基本知识点与总结(思维导图)

春天来了~只要收藏一张图就可以了哦

weixin_47269879的博客 310

设计模式深入浅出--14.动态、静态、CGlib代理模式及底层分库分表及spring、mybatis中的应用

代理模式 定义: 为其他对象提供一种代理,以控制对这个对象的访问 代理对象在客户端和目标对象之间起到中介的作用 适用场景: 保护目标对象 增强目标对象 优点: 代理模式能将代理对象与真实被调用的目标对象分离 一定程度上降低了系统的耦合度 保护目标对象 增强目标对象 缺点: 代理模式会造成系统设计中类的数目增加 在客户端和目标对象增加一个代理对象,会造成请求处理速度变慢...

moxiaolin的博客 236

Java代理模式深度解析:从静态代理到动态代理(JDK/CGLIB)与Spring AOP实践

代理模式是面向对象编程中一种重要的结构型设计模式,其核心原理是为其他对象提供一个代理或占位符,以控制对该对象的访问。这一机制允许在不修改原始对象代码的前提下,实现对目标方法的增强,如日志记录、性能监控、事务管理和安全检查等横切关注点的集中处理。从技术价值看,代理模式有效解决了代码重复和职责混乱问题,提升了系统的可维护性和扩展性。在Java生态中,代理模式主要有静态代理和动态代理两种实现方式,其中动态代理又分为基于接口的JDK动态代理和基于继承的CGLIB动态代理。这些技术广泛应用于企业级开发框架中,特别是S

weixin_33674976的博客 468

从生活场景、业务场景剖析代理模式(JDK、CGLIB、spring)

文章目录代理模式应用场景 代理模式应用场景 代理模式就是一层代理,日常生活中的中介、经纪人,代码中的事务代理、非侵入式日志等都是代理。 代理模式就是代理对象持有被代理对象的引用,在代理类中访问代理对象的时候,在方法前后做一些处理逻辑。 比如经纪人持有明星的访问权,记者要采访明星,经纪人会对记者的访问做一些筛选、档期判断等操作,之后符合条件的话才会进入到访问明星的阶段。 代理模式属于结构型模式。 ...

路辉的博客 748
上一篇: Servlet3.0异步支持
下一篇: Spring中的AOP基础
pseudonym_
博客等级 码龄10年 88粉丝 205原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值