JDK 与 Cglib 的使用和对比

本文探讨了Spring AOP中JDK和CGLib两种动态代理方式的使用和区别。JDK动态代理通过实现InvocationHandler接口,调用invoke方法实现代理;CGLib则是通过创建被代理类的子类来实现。文中还分析了CGLib的Callback机制,包括NoOp、FixedValue、MethodInterceptor等。最后,文章对比了JDK与Cglib的适用场景和优缺点。
摘要由CSDN通过智能技术生成

Spring AOP 依靠 JDK 和 CGLib 进行动态代理实现。在此对两种实现方式的一些知识进行整理。

JDK

使用示例

/**
 * 需要被代理的接口
 */
interface Iinterface {

    String proxyMethod(String gift);
}


/**
 * 实现 InvocationHandler 接口,对 invoke 方法进行重写
 */
class MyHandler implements  {

    /**
     * @param proxy 生成的代理实例
     * @param method 被代理类的方法
     * @param args  传入的参数列表
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        // 对应被代理的方法
        if (method.getName().equals("proxyMethod")) {
            System.out.println("接受到参数:" + args[0]);
            return "返回值";
        }
        return null;
    }
}

public class Main {
    public static void main(String[] args) {
        Iinterface proxy = (Iinterface) Proxy.newProxyInstance(
                Thread.currentThread().getContextClassLoader(),
                new Class[]{Iinterface.class},
                new MyHandler()
        );
        String res = proxy.proxyMethod("传入的参数");
        System.out.println(res);
    }
}

可见代理成功。

概括一下,动态代理的方式一般为:

  • 继承 InvocationHandler ,重写方法 invoke

  • 执行 Proxy.newProxyInstance 生成动态代理类

invoke 方法

由上可以看出,proxy 成功对 Iinterface 接口进行代理,但是在使用时,我们并未见到 InvocationHandler 中 invoke 方法的调用,动态代理是如何执行 invoke 的呢?

采用其他资料生成的案例,以下是代理类的反编译代码。

参考链接:链接1 链接2

首先来看看代理类的继承关系:

可以看到代理类继承了 Proxy ,再来看看代理类中的方法调用,其中 teach() 是被代理接口的方法声明,内部知识简单地调用了父类即 Proxy 的 h 属性的 invoke 方法

再回看 Proxy 类的属性

可以猜测,对被代理方法进行调用时,会转而由被代理类中继承自 Proxy 的 InvocationHandler 执行,从而 invoke方法被调用。再来看看调用的 newProxyInstance 的逻辑,代码进行了省略,添加了简单注释

public static 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值