美文网首页
Spring AOP的实现原理--CGLIB动态代理

Spring AOP的实现原理--CGLIB动态代理

作者: 码而优则仕 | 来源:发表于2020-07-17 21:25 被阅读0次

Spring AOP的实现原理--CGLIB动态代理

CGLIB(Code Generation Library)

JDK 动态代理需要代理类实现接口--生成动态代理类的时候需要传入被代理类实现的接口。

  • CGLIB不要求被代理类实现接口

  • 内部主要封装了ASM(Java字节码操控框架)CGLIB是基于ASM封装的上层应用库

  • 动态生成子类以覆盖非 final的方法,绑定钩子回调自定义拦截器

CGLIB核心类或接口讲解:

Callback回调接口

package net.sf.cglib.proxy;

public interface Callback {
}

MethodInterceptor接口继承自Callback 接口具有回调功能,相当于 JDK动态代理里面的 InvocationHandler

package net.sf.cglib.proxy;

import java.lang.reflect.Method;
//用于拦截方法调用
public interface MethodInterceptor extends Callback {
//该拦截方法前三个参数和 JDK动态代理的 InvocationHandler接口中的invoke(Object proxy, Method method, //Object[] args) 相同
//   /** @param proxy  Object proxy:真实的代理对象(不是被代理对象)。
     * @param method Method method:表示的是目标对象(被代理对象)的方法的实例
     * @param args   Object[] args:方法里面需要用到的参数 
     MethodProxy CGLIB生成代替Method的动态代理Method对象**/
    Object intercept(Object var1, Method var2, Object[] var3, MethodProxy var4) throws Throwable;
}

核心类:Enhancer

package net.sf.cglib.proxy;
public class Enhancer extends AbstractClassGenerator {

//通过公共的或者静态的 create 方法就能创建出对应的动态代理实例来
  public static Object create(Class type, Callback callback) {
        Enhancer e = new Enhancer();
        e.setSuperclass(type);
        e.setCallback(callback);
        return e.create();
    }

    public static Object create(Class superclass, Class[] interfaces, Callback callback) {
        Enhancer e = new Enhancer();
        e.setSuperclass(superclass);
        e.setInterfaces(interfaces);
        e.setCallback(callback);
        return e.create();
    }

CGLIB使用:

Aspect

public class AlipayMethodInterceptor implements MethodInterceptor {

    /**
     *
     * @param o 真实的代理对象(非被代理对象)
     * @param method 表示的是目标对象(被代理对象)的方法的实例
     * @param args 方法里面需要用到的参数
     * @param methodProxy CGLIB生成代替Method的动态代理Method对象
     * @return
     * @throws Throwable
     */
    @Override
    public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        beforePay();
        //执行被代理类的方法逻辑
        Object result = methodProxy.invokeSuper(o,args);
        afterPay();
        return result;
    }

    private void afterPay() {
        System.out.println("支付给商家");
    }

    private void beforePay() {
        System.out.println("从招商银行取款");
    }
}
public class CglibUtil {

    public static <T> T createProxy(T targetObject, MethodInterceptor methodInterceptor) {
        return (T) Enhancer.create(targetObject.getClass(), methodInterceptor);
    }
}
 CommonPayment commonPayment = new CommonPayment();
JdkDynamicProxyUtil.newProxyInstance(commonPayment, handler);
        AlipayMethodInterceptor alipayMethodInterceptor = new AlipayMethodInterceptor();
        CommonPayment commonPaymentProxyWithCglib = CglibUtil.createProxy(commonPayment, alipayMethodInterceptor);
        commonPaymentProxyWithCglib.pay();

输出:

从招商银行取款
个人名义或者公司名义都可以走这个支付通道
支付给商家

JDK动态代理和CGLIB

实现机制:

  • JDK动态代理:基于反射机制实现,要求业务类必须实现接口

  • CGLIB:基于ASM机制实现,生成业务类的子类作为代理类

JDK动态代理的优势:

  • JDK原生,在JVM里运行较为靠谱

  • 平滑支持JDK版本的升级

CGLIB的优势:

被代理对象无需实现接口,能实现代理类的无侵入。

Spring AOP 的底层机制:

CGLIB和JDK动态代理共存

默认策略,如果目标Bean实现了接口则使用JDK,否则使用CGLIB

相关文章

  • Spring AOP的实现原理--CGLIB动态代理

    Spring AOP的实现原理--CGLIB动态代理 CGLIB(Code Generation Library)...

  • Spring之使用XML配置Spring AOP

    1.aop的原理 Spring AOP底层主要使用了JDK动态代理和cglib动态代理。具体可看文章设计模式之代理...

  • spring aop 汇总

    静态代理、动态代理和cglib代理 aop 使用 Spring AOP - 注解方式使用介绍spring aop ...

  • Spring AOP 实现原理

    Spring AOP 实现原理 静态代理 众所周知 Spring 的 AOP 是基于动态代理实现的,谈到动态代理就...

  • java动态代理

    目录: 简介 jdk动态代理 cglib动态代理 jdk动态代理与cglib的区别 应用spring的aop 简介...

  • Spring AOP实现

    使用SpringBoot实现AOP动态代理 1 使用CGLIB实现AOP动态代理 .properties .xml

  • 2018-10-03

    Spring aop 是通过代理实现的,代理有静态代理,jdk动态代理和cglib动态代理,代理就像我们生活中的房...

  • Spring面试常问内容

    Spring 面试问题 TOP 50 IOC、AOP、AOP原理动态代理和cglib原理与二者之间的区别、Bean...

  • 2018-09-16

    AOP的XML配置: AOP的先关术语: Spring底层的AOP实现原理 动态代理: JDK动态代理:只能对实现...

  • SpringAOP源码解析过程

    spring的AOP基于JDK的动态代理和cglib实现,默认代理对象是某个接口的实现就会使用JDK动态代理,否则...

网友评论

      本文标题:Spring AOP的实现原理--CGLIB动态代理

      本文链接:https://www.haomeiwen.com/subject/zpinhktx.html