动态代理(CGLIB实现)

Posted 如若千夫所指

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态代理(CGLIB实现)相关的知识,希望对你有一定的参考价值。

 

 

CGLIB(Code Generation Library)是一个开源项目。可以直接对类进行增强,而不需要像JDK的动态代理,需要增强的类必须实现某接口

在使用Spring框架时,因为Spring框架中core包中引入了cglib所以如果想通过cglib来实现动态代理,不需要专门的导cglib的jar包。

创建代理工厂时,必须得实现MethodInterceptor接口,因为通过cglib创建的代理对象在调方法时会默认执行intercept方法,通过该方法增加目标对象方法。

 

public class CglibProxyFactory implements MethodInterceptor {

    //通过构造方法,把目标对象传进来
    private Object target;
    public CglibProxyFactory(Object target) {
        this.target = target;
    }
    
    //得到代理对象
    public Object getProxyObject() {
        Enhancer enhancer = new Enhancer();           //实例化cglib代理增强器-
        
        enhancer.setSuperclass(target.getClass());    //设置目标的类:通过目标类对象来生成代理子对象
        
        enhancer.setCallback(this);                   //回调方法        参数:回调的对象
        
        return enhancer.create();                     //  通过增强器得到代理对象
    }
    
    //增强目标对象方法
    @Override
    public Object intercept(
            Object proxy,                           //代理对象
            Method method,                      //目标对象的方法
            Object[] args,                          //需要增强的方法的参数
            MethodProxy proxyMethod     //代理对象的方法继承目标对象的方法(method)
            ) throws Throwable {
        
        System.out.println("前置增强");
        
        //直接调用目标对象的方法(目标方法执行方式1)
        Object value =  method.invoke(target, args);
        
        //调用代理代理对象的父类方法,相当于间接调用目标对象的方法(目标方法执行方式2)
         Object value = proxyMethod.invokeSuper(proxy, args);
        
         System.out.println("后置增强");
        
         return value;
    }

}

以上是关于动态代理(CGLIB实现)的主要内容,如果未能解决你的问题,请参考以下文章

jdk动态代理和cglib动态代理底层实现原理详细解析(cglib动态代理篇)

JDK动态代理与CGLIB动态代理

JDK动态代理与CGLIB动态代理

Cglib方法实现动态代理

zbb20180930 代理模式 -静态代理-jdk动态代理-cglib动态代理

代理模式-CGLib动态代理