CGLib动态代理

CGLib原理:动态生成一个要代理类的子类,子类重写要代理的类的所有不是final的方法。在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势植入横切逻辑。
CGLib动态代理是利用ASM开源包,对代理对象类的class文件,通过修改其字节码生成子类来处理。核心是实现MethidInterceptor接口,使用intercept()方法进行面向切面的处理,调用相应的通知。
【和JDK代理的区别等见后面的章节】

需要导入相关的依赖

<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>3.2.5</version>
</dependency>
  • 目标对象 (这里目标对象没有实现任何接口,所以不能使用JDK动态代理)
public class UserDao{

    public void save() {
        System.out.println("保存数据");
    }
}
  • 代理对象模板
public class ProxyFactory implements MethodInterceptor{

    private Object target;//维护一个目标对象
    public ProxyFactory(Object target) {
        this.target = target;
    }
    
    //为目标对象生成代理对象
    public Object getProxyInstance() {
        //工具类
        Enhancer en = new Enhancer();
        //设置父类
        en.setSuperclass(target.getClass());
        //设置回调函数
        en.setCallback(this);
        //创建子类对象代理
        return en.create();
    }

    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("开启事务");
        // 执行目标对象的方法
        Object returnValue = method.invoke(target, args);
        System.out.println("关闭事务");
        return null;
    }
}
  • 测试
public class TestProxy {

    @Test
    public void testCglibProxy(){
        //目标对象
        UserDao target = new UserDao();
        System.out.println(target.getClass());
        //代理对象
        UserDao proxy = (UserDao) new ProxyFactory(target).getProxyInstance();
        System.out.println(proxy.getClass());
        //执行代理对象方法
        proxy.save();
    }
}
posted @ 2021-01-14 22:03  刘指导  阅读(167)  评论(0编辑  收藏  举报