一、CGLIB 动态代理
静态代理和 JDK 动态代理模式有个相同的特点就是都是依靠接口实现的,然而并不是所有的类都有接口的,这个时候就用不了 JDK 动态代理了,CGLIB 动态代理就可以闪亮登场了
CGLIB 动态大力采用了非常底层的字节码技术,其原理是通过字节码技术在内存中为一个类创建子类,并在子类中采用方法拦截的方式拦截所有父类方法的调用,顺势织入横切逻辑,实现方法增强
二、CGLIB 动态代理实现步骤
- 查找 A 类上的所有非 final 的 public 类型的方法定义
- 将这些方法的定义转换成字节码
- 将组成的字节码转换成相应的代理的 class 对象
- 实现 MethodInterceptor 接口,用来处理对代理类上所有方法的请求
这个接口和 JDK 动态代理中的 InvocationHandler 接口功能和角色是一样的
三、实战演示
真实角色
public class UserServiceImpl {
public void select() {
System.out.println("查询了一个用户");
}
}
代理类
public class Proxy implements MethodInterceptor {
private Object target; // 聚