首页   快速返回

jdk代理与cglib代理的区别     所属分类 spring
jdk代理基于接口  只能代理实现了接口的类

cglib 对指定的目标类生成一个子类,覆盖其中方法实现增强,因为使用继承,所以不能对final修饰的类和方法进行代理

cglib(Code Generation Library) 依赖于ASM库
ASM是一个Java字节码操纵框架,用来动态生成类或者增强既有类的功能。ASM可以直接产生二进制class文件,也可以在类被载入Java虚拟机之前动态改变类行为。

Spring AOP 实际上是对JDK代理和CGLIB代理做了一层封装,并且引入了AOP概念:Aspect、advice、joinpoint等,
同时引入了AspectJ中的一些注解@pointCut,@after,@before等.
Spring Aop 都是动态代理,使用了aspectj 的切点表达式 

spring中强制使用cglib代理
 


JDK动态代理过程

1.获取目标对象上的所有接口列表;
2.确定要生成的代理类的类名,默认为:com.sun.proxy.$ProxyXXXX ;
3.根据需要实现的接口信息,在代码中动态创建该Proxy类的字节码;
4.将对应的字节码转换为对应的class 对象;
5.创建InvocationHandler实例handler,用来处理Proxy所有方法调用;
6.Proxy的class对象以创建的handler对象为参数,实例化一个proxy对象。

JDK通过 java.lang.reflect.Proxy 来支持动态代理,一般情况下,使用 newProxyInstance方法。

public static Object newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h)

InvocationHandler 的invoke方法

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable


生成动态代理类的字节码并且保存到硬盘中
sun.misc.ProxyGenerator.generateProxyClass(String proxyName,class[] interfaces) 


cglib 关键接口及代码


MethodInterceptor (与 InvocationHandler 类似)
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {

Target target = new TargetObject()
Enhancer enhancer = new Enhancer();
//设置要创建动态代理的类  
enhancer.setSuperclass(target.getClass());
// 设置回调,这里相当于是对于代理类上所有方法的调用,都会调用CallBack  
enhancer.setCallback(new XXXMethodInterceptor());
Object proxy = enhancer.create();


        
其他代理框架

Javassist是一个开源的分析、编辑和创建Java字节码的类库
JBoss 使用 Javassist 实现 动态AOP框架

AspectJ 静态编译织入

上一篇     下一篇
分布式id生成方案

linux常用命令实战

linux系统管理常用命令实战

几个经济学段子

linux性能监控常用命令

如何写好商业计划书要点