首页 > 其他分享 >spring--CGLIB动态代理的实现原理

spring--CGLIB动态代理的实现原理

时间:2024-01-20 20:11:54浏览次数:27  
标签:调用 -- spring 代理 目标 intercept CGLIB 方法

CGLIB(Code Generation Library)是一个强大的、高性能、高质量的代码生成库,它可以在运行时扩展 Java 类和实现 Java 接口。CGLIB 动态代理是基于继承的方式来实现的,它不需要接口,可以代理普通类。以下是 CGLIB 动态代理的实现原理:

  1. 继承:CGLIB 动态代理通过继承目标类来创建子类,并在子类中覆盖父类的方法。

  2. 代码生成:CGLIB 使用 ASM(一个 Java 字节码操作和分析框架)来操作和生成 Java 字节码,生成新的类。

  3. 方法拦截:CGLIB 提供了 MethodInterceptor 接口,它类似于 JDK 动态代理的 InvocationHandler。用户需要实现这个接口,并在 intercept 方法中定义拦截逻辑。

  4. 创建代理实例:通过使用 Enhancer 类(CGLIB 的类生成器),可以创建一个代理实例。Enhancer 允许设置父类(目标类)、回调(如 MethodInterceptor)等信息,并最终生成一个继承自目标类的代理类的对象。

  5. 方法调用处理:当调用代理实例上的方法时,CGLIB 会将调用重定向到 MethodInterceptor 实现的 intercept 方法。intercept 方法可以做一些额外处理,比如日志记录、权限验证等,然后通过反射调用目标类(父类)中的相应方法。

  6. 执行目标方法:在 MethodInterceptorintercept 方法中,你可以决定是否调用目标类的方法,以及如何调用。通常情况下,你会使用 MethodProxy 对象(intercept 方法的一个参数),它提供了 invokeSuper 方法来调用父类的原始方法。

  7. 返回结果:目标方法执行后的返回值可以被返回给代理对象的方法调用者,或者可以返回一个自定义的值。

CGLIB 动态代理的优点是它不需要目标对象实现任何接口,因此非常适用于代理类本身没有实现接口的情况。但是,由于它是通过继承来实现代理的,因此无法对 final 类或 final 方法进行代理。

总的来说,CGLIB 动态代理通过在运行时生成目标类的子类,并在子类中插入自定义的方法拦截逻辑,从而实现对目标类方法的代理。这种方法在不改变原有代码结构的情况下,为在目标对象的方法调用前后添加额外的处理提供了一种强大的方式。

标签:调用,--,spring,代理,目标,intercept,CGLIB,方法
From: https://www.cnblogs.com/xylfjk/p/17977075

相关文章

  • 比特币客户端&比特币回归测试网络
    比特币客户端&比特币回归测试网络实验概述区块链技术需要协调一个庞大的去中心化网络以实现功能复杂的分布式状态机副本,必然涉及频繁的指令交互。在此过程中,除了设计功能完备、高鲁棒性的客户端程序,作为构建和调试分布式系统的重要协议,RPC(远程过程调用)也是实现上述功能不可或缺......
  • spring--AOP通知类型有哪些
    SpringAOP(Aspect-OrientedProgramming,面向切面编程)提供了五种类型的通知(advice),这些通知定义了切面(aspect)是在目标对象的方法执行的哪个点被应用。以下是这五种通知类型:前置通知(Beforeadvice):在目标方法执行之前执行的通知,无法阻止方法的继续执行(除非它抛出一个异常)。后置......
  • 简单剖析Hashmap
    剖析JavaHashmap源码在Java的集合框架中,HashMap是一颗璀璨的明珠。通过深入挖掘其源码,我们将揭开HashMap的神秘面纱,理解其底层原理、扩容机制和数据结构。1.HashMap源码导读我们首先来看一段简单的代码,创建一个空的HashMap:importjava.util.HashMap;publicclass......
  • 2024.1.20
    1.异常(1)检查性异常:最具代表性的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在的文件时,一个异常就发生了,这些异常不能被简单地忽略。(2)运行时异常:运行时异常时可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。(3......
  • spring--JDK动态代理和CGLIB代理的区别
    JDK动态代理和CGLIB代理是Java中常用的两种动态代理实现方式,它们各有特点和适用场景:JDK动态代理:JDK动态代理是基于接口的代理方式,它使用Java反射机制来创建代理对象,并要求目标对象实现一个或多个接口。在代理过程中,JDK动态代理会创建一个实现了目标对象所有接口的代......
  • 使用Go语言构造区块链
    使用Go语言构造区块链实验概述21世纪最具先峰性的代表性技术之一,就是区块链。目前,它仍然处于,并将长期处于不断成长的时期,而且,在他的身上,还有很多潜在的力量,没有完全展露出来。从本质上来讲,区块链的核心,可以说是一个分布式数据库而已。不过,在区块链中,与传统的分布式数据库,最为独......
  • MyBatis 系列:MyBatis 源码环境搭建
    目录一、环境准备二、下载MyBatis源码和MyBatis-Parent源码三、创建空项目、导入项目四、编译mybatis-parent五、编译mybatis六、测试总结一、环境准备jdk:17maven:3.9.5二、下载MyBatis源码和MyBatis-Parent源码Mybatis:https://github.com/mybatis/mybatis-3.gitMy......
  • 外卖项目again
    一、开发环境html文件夹-----sky文件夹----前端工程打包之后的效果。运行nginx服务器(端口号默认80,双击即启动),前端环境相当于就已经具备了。注意:nginx文件夹必须放在没有中文的目录中,才可正常启动。启动nginx服务器:双击nginx.exe启动,nginx端口号默认80,所以直接输入localhost就......
  • 柏拉图:《理想国》
    柏拉图:《理想国》发布日期:2019-06-03    作者:    来源:    点击:2749内容简介   《理想国》涉及柏拉图思想体系的各个方面,包括哲学、伦理、教育、文艺、政治等内容,主要是探讨理想国家的问题。《理想国》一书是柏拉图的一篇重要对话录,对话录里柏拉图以苏......
  • SpringMVC常用注解
    探索SpringMVC常用注解SpringMVC是一个用于构建Web应用程序的框架,它提供了丰富的注解来简化开发过程。在这篇文章中,我们将深入了解一些常用的SpringMVC注解,从它们的起因到实际应用。起因Web应用程序的开发涉及到处理HTTP请求和响应,传统的方式通常需要编写大量的XML配置和复杂的......