Mongoosej.Blog.Infrastructure.Programming.Java.Aspect.代理 :::info 版权声明:本文为语雀博主「mongoosej」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://www.yuque.com/mongoosej/blog/java-proxy :::


代理,分为静态代理和动态代理。静态代理,代理类直接定义在代码中。动态代理,代理类动态生成。
动态代理是一种强大的功能,它可以在运行时动态创建一个类,实现一个或多个接口,可以在不修改原有类的基础上动态为通过该类获取的对象添加方法、修改行为。
动态代理是实现面向切面的编程AOP(Aspect Oriented Programming)的基础。
动态代理有两种实现方式:JDK代理、CGLib(Code Generation Library)代理。

Java SDK动态代理的局限在于,它只能为接口创建代理,返回的代理对象也只能转换到某个接口类型。

cglib的实现机制与Java SDK不同,它是通过继承实现的,它也是动态创建了一个类,但这个类的父类是被代理的类,代理类重写了父类的所有public非final方法,改为调用Callback中的相关方法。

Java SDK代理面向的是一组接口,它为这些接口动态创建了一个实现类。接口的具体实现逻辑是通过自定义的InvocationHandler实现的,这个实现是自定义的,也就是说,其背后都不一定有真正被代理的对象,也可能有多个实际对象,根据情况动态选择。cglib代理面向的是一个具体的类,它动态创建了一个新类,继承了该类,重写了其方法。

从代理的角度看,Java SDK代理的是对象,需要先有一个实际对象,自定义的InvocationHandler引用该对象,然后创建一个代理类和代理对象,客户端访问的是代理对象,代理对象最后再调用实际对象的方法;cglib代理的是类,创建的对象只有一个。

reference

Spring AOP 代理实现的两种方式: JDK动态代理 和 Cglib框架动态代理
Java代理(proxy)