CGLIB 动态代理

article/2025/10/31 13:19:31

目录

CGLIB 动态代理

简单结构:

添加依赖

定义类


CGLIB 动态代理

        JDK的动态代理机制只能代理实现了接口的类。而不能实现接口的类就不能使用JDK的动态代理,CGLIB是针对类来实现代理的,它的原理是对指定目标类生成一个子类,并覆盖其中的方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。

简单结构:

        实现原理:继承思想

代理类继承目标类,重写目标类中的方法,

        CGLIB像是一个拦截器,在调用我们的代理类方法时,代理类(子类)会去找到目标类(父类),此时它会被一个方法拦截器所拦截,在拦截器中才会去实现方法的调用。并且还会对方法进行行为增强。

简单实现

添加依赖

在pom.xml文件中引入CGLIB的相关依赖

​
<!-- https://mvnrepository.com/artifact/cglib/cglib --><dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.3.0</version></dependency>​

定义类

实现MethodInterceptor接口

​
package org.example.proxy;import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;import java.lang.reflect.Method;public class Cglib implements MethodInterceptor {//准备一个目标对象private Object target;//通过构造器传入目标对象public Cglib(Object target) {this.target = target;}/** 用来获取代理对象(创建一个代理对象)* */public Object getProxy(){//可以通过Enhancer对象中的create()方法可以去生成一个类,用于生成代理对象Enhancer enhancer=new Enhancer();//设置父类(将目标类作为代理类的父类)enhancer.setSuperclass(target.getClass());//设置拦截器(回调对象为本身对象)enhancer.setCallback(this);//生成一个代理类对象并返回给调用着return enhancer.create();}/** 拦截器*       1.目标对象的方法调用*       2.行为增强*      参数 o: cglib 动态生成的代理类的实例*          method:实体类所调用的都被代理的方法的引用*          objects 参数列表*          methodProxy:生成的代理类对方法的代理引用* */@Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {//增强行为System.out.println("方法执行前的增强行为");//调用目标类中的方法Object Objectss=  methodProxy.invoke(target,objects);//增强行为System.out.println("方法执行后的增强行为");return null;}
}​

定义一个test()类

package org.example.proxy;public class test3 {public static void main(String[] args) {//得到目标对象You you=new You();//得到代理类Cglib cglib=new Cglib(you);//得到代理对象Marry marry= (Marry) cglib.getProxy();//通过代理对象调用目标对象的方法marry.toMarry();}
}

 

 那我们来了解一下CGLIB的实现流程

                我们最终是要通过一个代理对象去调用方法的,那我们就要获取一个代理对象,

CGLIB代理,是通过Enhancer这个类里面对应的一个create()方法,去生成一个代理对象的。

那么咱们就先创建一个Enhancer对象,拿到这个对象之后,虽然我们是要获取一个代理对象,但你要获取谁的代理对象?咱们是不是要知道。而前面提到CGLIB体现的是继承思想,所以我们需要把代理类作为我们目标类的一个子类,也就是把目标类设置为父类,代理类去继承它。

 //设置父类(将目标类作为代理类的父类)enhancer.setSuperclass(target.getClass());
      在你获取代理对象之前,我们应该知道目标对象是谁吧?  

获取目标对象,我们还是通过带参构造传进来的。

 //准备一个目标对象private Object target;//通过构造器传入目标对象public Cglib(Object target) {this.target = target;}
目标对象有了,通过Enhancer代理对象也有了。那么我们创建的类为什么要实现MethodInterceptor接口?

在上图中我们说过会有一个拦截器,MethodInterceptor就是起到的一个拦截作用,在你调用目标类的方法后,它就会被我们的一个拦截器所拦截。

        实现MethodInterceptor接口就必须重写intercept方法

 /** 拦截器*       1.目标对象的方法调用*       2.行为增强*      参数 o: cglib 动态生成的代理类的实例*          method:实体类所调用的都被代理的方法的引用*          objects 参数列表*          methodProxy:生成的代理类对方法的代理引用* */@Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {//增强行为System.out.println("方法执行前的增强行为");//调用目标类中的方法Object Objectss=  methodProxy.invoke(target,objects);//增强行为System.out.println("方法执行后的增强行为");return Objectss;}

在intercept方法中我们用methodProxy.invoke(参1,参2);调用目标类中的方法。两个参数分别为目标对象,方法中的参数


JDK代理与CGLIB代理的区别

  • JDK动态代理实现接口,CGLIB动态继承思想
  • JDK动态代理(目标对象存在接口时)执行效率高于CIGLIB
  • 如果对象有接口实现,选择JDK代理,如果没有接口实现选择CGILB代理

http://chatgpt.dhexx.cn/article/9kRJ4ZtZ.shtml

相关文章

jdk代理和cglib代理

1.jdk代理 描述&#xff1a;jdk代理&#xff0c;就是一个类A实现某个接口G&#xff0c;重写了G的方法。现在要对A的方法进行增强&#xff0c;但是不要修改A的代码。所以创建类B&#xff0c;也实现接口G&#xff0c;在这个方法里面写增强业务&#xff0c;但是具体方法调用A的。…

cglib代理解析

工作原理 使用 <dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.3.0</version></dependency>对类和接口分别进行代理 DemoService package com.fanqiechaodan.user.service;/*** author fa…

CGLib之Enhancer

Enhancer允许为非接口类型创建一个Java代理。Enhancer动态创建了给定类型的子类但是拦截了所有的方法。和Proxy不一样的是&#xff0c;不管是接口还是类他都能正常工作。 来个场景模拟一下AOP package cglib.enhancer;public class Hello {public String sayHello(boolean thr…

cglib源码学习交流

背景 前段时间在工作中&#xff0c;包括一些代码阅读过程中&#xff0c;spring aop经常性的会看到cglib中的相关内容&#xff0c;包括BeanCopier,BulkBean,Enancher等内容&#xff0c;以前虽大致知道一些内容&#xff0c;原理是通过bytecode&#xff0c;但没具体深入代码研究&a…

CGLib浅析

CGLib浅析 什么是CGLib CGLIB实现动态代理&#xff0c;并不要求被代理类必须实现接口&#xff0c;底层采用asm字节码生成框架生成代理类字节码(该代理类继承了被代理类)。 所以被代理类一定不能定义为final class并且对于final 方法不能被代理。 实现需要 //MethodIntercept…

CGLIB

1、CGLIB 官网&#xff1a;http://cglib.sourceforge.net CGLIB是一个强大的高性能的代码生成包。它被许多AOP的框架&#xff08;例如Spring AOP&#xff09;使用&#xff0c;为他们提供方法的interception&#xff08;拦截&#xff09;。 Hibernate也使用CGLIB来代理单端si…

CGLIB代理到底是个什么东西?这是一篇最全的CGLIB大全

目录 0 概述 0.1 CGLIB包结构 1 使用CGLIB实现动态代理 1.1 CGLIB代理相关的类 1.2 CGLIB动态代理的基本原理 1.3 使用MethodInterceptor接口实现方法回调 1.3.1 实现MethodInterceptor接口 1.4 使用CGLIB代理最核心类Enhancer生成代理对象 1.5 使用CGLIB继进行动态代理…

什么是CGLIB,CGLIB使用简介

什么是CGLIB CGLIB是一个强大的、高性能的代码生成库。其被广泛应用于AOP框架&#xff08;Spring、dynaop&#xff09;中&#xff0c;用以提供方法拦截操作。Hibernate作为一个比较受欢迎的ORM框架&#xff0c;同样使用CGLIB来代理单端&#xff08;多对一和一对一&#xff09;…

cglib动态代理 | 如何生成代理类、代理类内容解析

文章目录 简介一、cglib动态代理有什么特点CgLib动态代理&#xff1a;优点&#xff1a;缺点&#xff1a; 二、Cglib如何生成代理类生成代理类的具体代码&#xff1a;生成代理对象的具体代码&#xff1a; 三、代理类内容解析持久化代理类&#xff1a;代理类内容&#xff1a; Cgl…

CGLib是什么

什么是CGLIB CGLIB是一个强大的、高性能的代码生成库。其被广泛应用于AOP框架&#xff08;Spring、dynaop&#xff09;中&#xff0c;用以提供方法拦截操作。Hibernate作为一个比较受欢迎的ORM框架&#xff0c;同样使用CGLIB来代理单端&#xff08;多对一和一对一&#xff09;…

什么是CGLIB,CGLIB使用简介,cglib

什么是CGLIB&#xff0c;CGLIB使用简介 2018年08月20日 10:41:31 axiaositong 阅读数&#xff1a;348 什么是CGLIB CGLIB是一个强大的、高性能的代码生成库。其被广泛应用于AOP框架&#xff08;Spring、dynaop&#xff09;中&#xff0c;用以提供方法拦截操作。Hibernate作为…

(转帖)Cglib和jdk动态代理的区别及运行性能比较

动态代理解决了方法之间的紧耦合&#xff0c;IOC解决了类与类之间的紧耦合&#xff01; Cglib和jdk动态代理的区别&#xff1f; 1、Jdk动态代理&#xff1a;利用拦截器&#xff08;必须实现InvocationHandler&#xff09;加上反射机制生成一个代理接口的匿名类&#xff0c;在…

CGLib动态代理原理

CGLib动态代理原理 CGLib动态代理是代理类去继承目标类&#xff0c;然后重写其中目标类的方法啊&#xff0c;这样也可以保证代理类拥有目标类的同名方法&#xff1b; 看一下CGLib的基本结构&#xff0c;下图所示&#xff0c;代理类去继承目标类&#xff0c;每次调用代理类的方…

CGLib介绍

1. CGLIB介绍 CGLIB(Code Generation Library)是一个开源项目&#xff01;是一个强大的&#xff0c;高性能&#xff0c;高质量的Code生成类库&#xff0c; 它可以在运行期扩展Java类与实现Java接口。CGLIB是一个强大的高性能的代码生成包。它广泛的被许多AOP的框架使用&#…

cglib的简单使用

一、前言 最近在看Spring的源码&#xff0c;其中有牵扯到cglib的相关内容&#xff0c;遂简单记录下cglib是如何使用的 二、原理&#xff08;节选自网络&#xff09; CGLIB原理&#xff1a;动态生成一个要代理类的子类&#xff0c;子类重写要代理的类的所有不是final的方法。…

cglib动态代理

前面介绍了代理模式和JAVA动态代理&#xff0c;这片文章主要解析cglib动态代理实现。 基本介绍 CGLIB&#xff08;Code Generation Library&#xff09;&#xff0c;是一个强大的&#xff0c;高性能&#xff0c;高质量的 Code 生成类库&#xff0c;它可以在运行期扩展 Java 类…

动态代理之 cglib 实现

&#xff08;尊重劳动成果&#xff0c;转载请注明出处&#xff1a;https://blog.csdn.net/qq_25827845/article/details/87513102冷血之心的博客&#xff09; 目录 前言&#xff1a; 正文&#xff1a; AOP&#xff08;面向切面编程&#xff09; JDK动态代理 cglib实现动态…

CGLIB介绍与原理

一、什么是 CGLIB? CGLIB是一个功能强大&#xff0c;高性能的代码生成包。它为没有实现接口的类提供代理&#xff0c;为JDK的动态代理提供了很好的补充。通常可以使用Java的动态代理创建代理&#xff0c;但当要代理的类没有实现接口或者为了更好的性能&#xff0c;CGLIB是一个…

CGLIB(Code Generation Library)详解

什么是CGLIB CGLIB是一个强大的、高性能的代码生成库。其被广泛应用于AOP框架&#xff08;Spring、dynaop&#xff09;中&#xff0c;用以提供方法拦截操作。Hibernate作为一个比较受欢迎的ORM框架&#xff0c;同样使用CGLIB来代理单端&#xff08;多对一和一对一&#xff09;…

【动态代理】CGLIB 动态代理的使用及原理

1. CGLIB 动态代理介绍 什么是 CGLIB&#xff1f; CGLIB是一个功能强大&#xff0c;高性能的代码生成包。它为没有实现接口的类提供代理&#xff0c;为JDK的动态代理提供了很好的补充。 通常可以使用Java的动态代理创建代理&#xff0c;但当要代理的类没有实现接口或者为了更…