动态代理

370 阅读2分钟

JDK动态代理与Cglib动态代理

在学习spring的AOP中,对JDK动态代理与Cglib动态代理一直不太理解,这篇文章专门对代理模式,静态代理,jdk动态代理,cglib动态代理进行深入探索。

代理模式:代理模式是指调用者不直接调用实际的对象,也就是不去new这个对象,而是通过调用代理类间接调用这个对象及其方法。

JDK动态代理

JDK动态代理主要涉及到了两个类(Proxy与InvocationHandler)
Proxy用于为接口生成代理类及对象,通过Proxy.newProxyInstance方法去生成代理类对象。

通过源码可以看到,其通过java的反射机制去生成代理对象。然后再看一下这个方法参数,需要接口及InvocationHandler,说明JDK动态代理的对象必须实现接口。 InvocationHandler是一个接口,用于定义代理行为.

代理行为: 代理类往往会在代理对象业务逻辑前后增加一些功能性的行为,如使用事务或者打印日志。本文把这些行为称之为代理行为。

使用JDK动态代理,需要创建一个实现java.lang.reflect.InvocationHandler接口的类,并在该类中定义代理行为。

其中invoke是用来执行代理对象中的方法

CGLIB动态代理

cglib是一个强大的高性能的代码生成库,通过asm库生成字节码。 首先需要引入asm与cglibjar包,我们需要通过实现MethodInterceptor来定义代理行为,此接口集成Callback类。

cglib中,通过Enhancer生成代理对象

JDK动态代理与cglib对比

  • 字节码创建方式:JDK动态代理通过JVM实现代理类字节码的创建,cglib通过ASM创建字节码

  • 对被代理对象的要求:JDK动态代理要求被代理对象实现接口,cglib要求被代理对象未被final修饰

  • 代理对象创建速度:JDK动态代理创建代理对象速度比cglib快

  • 代理对象执行速度:JDK动态代理代理对象执行速度比cglib快