解析动态代理jdk的Proxy与spring的CGlib(包括区别介绍)

解析动态代理jdk的Proxy与spring的CGlib

什么是动态代理

动态代理是一种代理模式,它的作用是通过创建一个代理类来代替原始类进行引用,可以使用 Java API 来生成动态代理类,这个过程不需要预先定义代理类的代码。

JDK动态代理

JDK动态代理是Java提供的一种代理方式,需要有接口来实现代理。在运行时,它会为一个或多个接口动态生成一个实现类,该类实现了这些接口的所有方法,并将方法调用转移到一个指定的调用处理程序上。

JDK动态代理示例:

public interface IUserDao {
    void save();
}

public class UserDaoImpl implements IUserDao {
    @Override
    public void save() {
        System.out.println("save user");
    }
}

public class ProxyFactory implements InvocationHandler {
    private Object target;

    public ProxyFactory(Object target) {
        this.target = target;
    }

    public Object getProxy() {
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("before");
        Object result = method.invoke(target, args);
        System.out.println("after");
        return result;
    }
}

public class JDKDynamicProxyTest {

    public static void main(String[] args) {
        IUserDao userDao = new UserDaoImpl();
        ProxyFactory proxyFactory = new ProxyFactory(userDao);
        IUserDao proxy = (IUserDao) proxyFactory.getProxy();
        proxy.save();
    }
}

CGLib动态代理

CGLib(Code Generation Library)动态代理也是创建代理的一种方式,它是一个强大的、高性能的代码生成包,它能够在运行时动态生成字节码,从而创建一个动态代理对象。

CGLib动态代理示例:

public class User {
    private int id;

    public User(int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void save() {
        System.out.println("save user");
    }
}

public class CGLibProxy implements MethodInterceptor {

    private Object target;

    public CGLibProxy(Object target) {
        this.target = target;
    }

    public Object getProxy() {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(target.getClass());
        enhancer.setCallback(this);
        return enhancer.create();
    }

    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("before");
        Object result = proxy.invokeSuper(obj, args);
        System.out.println("after");
        return result;
    }
}

public class CGLibDynamicProxyTest {

    public static void main(String[] args) {
        CGLibProxy cgLibProxy = new CGLibProxy(new User(1));
        User proxy = (User) cgLibProxy.getProxy();
        proxy.save();
    }
}

JDK动态代理与CGLib动态代理的区别

  1. 接口:JDK动态代理可以为接口动态创建代理类,而CGLib动态代理不需要接口,可以针对类创建代理。

  2. 代理对象:JDK动态代理只能代理实现了接口的类,而CGLib动态代理可以代理任意类。

  3. 性能:CGLib动态代理更加强大和高效,但是在创建代理对象的时候比JDK动态代理更耗费时间和空间。

  4. 调用方式:JDK动态代理是通过反射调用方法,而CGLib动态代理是通过内存调用方法。

综上所述,JDK动态代理和CGLib动态代理在实现方式上存在一些差异,应根据不同的场景来选择合适的代理方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:解析动态代理jdk的Proxy与spring的CGlib(包括区别介绍) - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • Windows 批处理cmd/bat常用命令详解

    Windows 批处理cmd/bat常用命令详解 前言 Windows 批处理(cmd/bat)是一种可以在 Windows 系统下执行的脚本语言,可以用于自动化任务、批量处理等场景。本文将介绍一些常用的批处理命令。 常用命令 echo echo 命令用于在控制台输出文本或变量,并且可以通过重定向符号将输出结果写入文件。示例如下: @echo off ech…

    other 2023年6月26日
    00
  • 怎么隐藏文件夹

    隐藏文件夹的方法会因操作系统不同而有所不同,我会为您提供Windows和MacOS两个操作系统的方法。 Windows 在Windows上,隐藏文件夹需要进行以下步骤: 首先找到要隐藏的文件夹,右键单击它并选择“属性”。 在“属性”窗口的“常规”选项卡中,勾选“隐藏”。 点击“应用”按钮,然后点击“确定”按钮。 这样就能隐藏文件夹了。要查看隐藏的文件夹,需要…

    其他 2023年4月16日
    00
  • matlabr2017b安装及破解(安装详解)

    matlabr2017b安装及破解(安装详解) 介绍 MATLAB 是美国 MathWorks 公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境。作为matlab的用户,不少人会遭遇到安装matlab的一些问题,比如安装失败、破解不了等等。本文将对MATLAB R2017b的安装过程进行详解,帮助大家解决安…

    其他 2023年3月28日
    00
  • win10系统32位怎么升64位系统?win10系统32位升64位系统操作教程

    升级操作系统的过程是比较复杂的,需要一定的技术知识和操作经验。在升级前,请务必备份重要的文件和数据,以防数据丢失。以下是升级Win10 32位系统到64位系统的详细攻略: 步骤1:检查硬件兼容性首先,你需要确认你的计算机硬件是否支持64位操作系统。打开计算机的控制面板,点击“系统和安全”,然后点击“系统”。在“系统类型”一栏中,如果显示的是“32位操作系统”…

    other 2023年7月28日
    00
  • cucumber测试框架

    cucumber测试框架 介绍 Cucumber是一个基于行为驱动开发(BDD)的测试框架,它使用Gherkin语言来描述和组织测试用例。Gherkin语言是一种自然语言,易于理解和编写。 Cucumber框架可以用于多种编程语言,例如Ruby,Java,JavaScript等,它的运行结果会以人类可读的格式呈现,这让测试结果更加易于理解和交流。 如何使用 …

    其他 2023年3月29日
    00
  • 求32位机器上unsigned int的最大值及int的最大值的解决方法

    求32位机器上unsigned int的最大值及int的最大值的解决方法 在32位机器上,unsigned int的最大值可以通过以下步骤求得: 确定机器上整数类型的位数:32位机器上,整数类型的位数为32位。 计算unsigned int的最大值:由于unsigned int是无符号整数类型,它的取值范围是从0到2^32-1。因此,unsigned int…

    other 2023年7月28日
    00
  • java开发中嵌套类的详解及实例

    Java开发中嵌套类的详解及实例 在Java开发中,嵌套类是一种定义在另一个类内部的类。嵌套类可以分为静态嵌套类和非静态嵌套类两种类型。本文将详细讲解嵌套类的概念、用途以及提供两个示例说明。 1. 静态嵌套类 静态嵌套类是定义在另一个类内部的静态类。它可以直接通过外部类的名称访问,不需要创建外部类的实例。静态嵌套类可以访问外部类的静态成员和方法,但不能直接访…

    other 2023年7月27日
    00
  • BRC20之后又有ORC20谁将是王者?

    BRC20之后又有ORC20谁将是王者?攻略 1. 了解BRC20和ORC20的基本概念 在讨论哪个标准将成为王者之前,我们需要先了解BRC20和ORC20的基本概念。 BRC20:BRC20是Binance智能链(Binance Smart Chain)上的代币标准,类似于以太坊上的ERC20标准。它定义了代币的基本功能和接口,使得代币可以在Binance…

    other 2023年8月18日
    00
合作推广
合作推广
分享本页
返回顶部