CGLIB动态代理

CGLIB动态代理、

CGLIB(Code Generation Libarary)是一个高性能开源的代码生成包,采用非常底层的字节码技术,对指定的目标类生成一个子类,并对子类进行增强。

  • 1.创建目标类
  • 该类不需要实现任何接口。
    TsetDao类
package cglib;

public class TestDao {
    public void save(){
        System.out.println("保存");
    }
    public void modify(){
        System.out.println("修改");

    }
    public void delete(){
        System.out.println("删除");

    }
}

  • 2 创建代理类

CglibDynamicProxy类

package cglib;
/*
基于CGLIB动态代理
 */
import aspect.MyAspect;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class CglibDynamicProxy implements MethodInterceptor {
    //创建代理方法  生成CGLIB代理对象
    //target是目标对象 需要增强的对象
    //返回目标对象的CGLIB对象
    public  Object createProxy(Object target){
        //创建一个动态类的对象 即增强类对象
        Enhancer enhancer=new Enhancer();
        //确定需要增强的类 设置其父类
        enhancer.setSuperclass(target.getClass());
        //确定代理逻辑对象为当前对象 要求当前对象实现MethodInterceptor的方法
        enhancer.setCallback(this);
        return enhancer.create();
    }




    /**
     *intercept方法会在程序执行目标方法时被调用
     * @param proxy  是CGLIB根据指定父类生成的代理对象
     * @param method 是拦截方法
     * @param args    是拦截方法的参数数组
     * @param methodProxy  是方法的代理对象  用于执行父类的方法
     * @return
     * @throws Throwable
     */
    @Override
    public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        MyAspect myAspect=new MyAspect();
        //前增强
        myAspect.check();
        myAspect.except();
        //目标方法执行  返回代理结果
        Object obj=methodProxy.invokeSuper(proxy,args);
        myAspect.log();
        myAspect.monitor();
        return obj;
    }
}

  • 3 创建测试类
    在主方法中创建代理对象和目标对象,然后从代理对象中获取对目标对象增强后的对象。
    CglibDynamicTest类
package cglib;

public class CglibDynamicTest {
    public static void main(String[] args) {
        //创建代理对象
        CglibDynamicProxy cdp=new CglibDynamicProxy();
        //创建目标对象
        TestDao testDao=new TestDao();
        //获取增强后的目标对象
        TestDao testDaoAdvice=(TestDao)cdp.createProxy(testDao);
        testDaoAdvice.save();
        System.out.println("===============");
        testDaoAdvice.modify();
        System.out.println("===============");
        testDaoAdvice.delete();

    }
}

运行结果

`
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值