zoukankan      html  css  js  c++  java
  • 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();
        }
    }
    
  • 相关阅读:
    选择排序
    插入排序
    冒泡排序
    linux 常用命令全集
    Boost简介
    postgresql命令行
    Ncurses 命令行图形库
    rsync ssh文件同步
    BusyBox参考
    screen命令
  • 原文地址:https://www.cnblogs.com/liuzhidao/p/14279677.html
Copyright © 2011-2022 走看看