cglib动态代理商

作者 : 开心源码 本文共1834个字,预计阅读时间需要5分钟 发布时间: 2022-05-12 共156人阅读

概念及特点

  • 使用CGLib实现动态代理商,依赖cglib-x.x.x.jar
  • 原理是对指定的业务类动态生成一个子类,并覆盖其中业务方法实现代理商
  • 针对类来实现代理商的,完全不受代理商类必需实现接口的限制
  • CGLib底层采用ASM字节码生成框架,使用字节码技术生成代理商类
  • 由于采用的是继承,所以不能对final修饰的类进行代理商,不能对公告为final的方法进行代理商

组成

  • 业务实现类 负责实现主要的业务方法(不需要实现接口)
  • 实现阻拦接口MethodInterceptor,创立动态代理商类

案例演示

  1. 引入cglib

        <dependencies>        <dependency>            <groupId>cglib</groupId>            <artifactId>cglib</artifactId>            <version>2.2.2</version>        </dependency>    </dependencies>
  2. 业务实现类

    public class AccountServiceImpl {    public void queryAccount() {        System.out.println("查看账户...");    }    public void updateAccount() {        System.out.println("修改账户...");    }}
  3. 方法阻拦器

    public class CglibProxy implements MethodInterceptor {    private Object target;//业务类对象,供代理商方法中进行真正的业务方法调用    //相当于JDK动态代理商中的绑定    public Object getInstance(Object target) {        this.target = target;  //给业务对象赋值        Enhancer enhancer = new Enhancer(); //创立增强器,用来创立动态代理商类        enhancer.setSuperclass(this.target.getClass());  //为增强器指定要代理商的业务类(即:为下面生成的代理商类指定父类)        //设置回调:对于代理商类上所有方法的调用,都会调用CallBack,而Callback则需要实现intercept()方法进行阻拦        enhancer.setCallback(this);        // 创立动态代理商类对象并返回        return enhancer.create();    }    // 实现回调方法    @Override    public Object intercept(Object target, Method method, Object[] args, MethodProxy proxy) throws Throwable {        System.out.println("预解决——————");        proxy.invokeSuper(target, args); //调用业务类(父类中)的方法        System.out.println("调用后操作——————");        return null;    }}
    1. 业务调用
      public class CglibProxyApplication {      public static void main(String[] args) {          AccountServiceImpl accountServiceImpl=new AccountServiceImpl();          CglibProxy  cglib=new CglibProxy();          AccountServiceImpl accountServiceProxy=(AccountServiceImpl)cglib.getInstance(accountServiceImpl);          accountServiceProxy.queryAccount();          accountServiceProxy.updateAccount();      }  }

两种动态代理商比照

  1. 机制区别
  • jdk动态代理商是通过接口中的方法名,在动态生成的代理商类中调用业务实现类的同名方法;利用阻拦器(阻拦器必需实现InvocationHanlder)加上反射机制生成一个实现代理商接口的匿名类;
  • cglib动态代理商是通过继承业务类,生成的动态代理商类是业务类的子类,通过重写业务方法进行代理商;cglib底层采用ASM字节码生成框架,使用字节码技术生成代理商类;
  1. 效率比照
  • jdk6之前,cglib效率过于jdk反射
  • 调用次数较少时,jdk6、jdk7优于cglib
  • 调用次数较多时,jdk6、jdk7反射效率低于cglib
  • jdk8 动态代理商优于cglib效率

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » cglib动态代理商

发表回复