全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Spring学习之动态代理(JDK动态代理和CGLIB动态代理)

前言

动态代理,是一种通过运行时操作字节码,以达到增强类的功能的技术,也是Spring AOP操作的基础,关于AOP的内容,将在后面的笔记中详细讲解,本小节主要是理清楚动态代理,毕竟,Spring的AOP是基于动态代理技术,对动态代理技术有所了解,对于学习Spring AOP也会有帮助

动态代理技术详解

动态代理,现在主要是用于增强类的功能,同时由于是具有动态性,所以避免了需要频繁创建类的操作,同时,也使得原有的代码在不需要改变的情况下,对类的功能进行增强,主要的动态代理技术有:通过实现目标接口,重写其方法,以增强其能力,典型的以JDK动态代理为代表;或者,通过继承类,重写其方法以增强其能力,典型的以CGLib为代表,这两种技术分别从不同的方向来对类的能力进行扩充,接下来来具体看下这两种技术的特点以及差异。

基于JDK动态代理

基于JDK的动态代理技术,其主要特点就是目标类,也就是需要被代理的类,必须有接口,并且代理类必须实现跟它一样的接口,从而来起到代理其事务的功能,具体使用如下代码所示,假设有一个UserService类,主要用于负责用户的登录和退出,同时,有个日志类,负责记录用户的操作信息,直接将信息日志写在对应的UserService实现类中,可以达到目的,但显然这种方式不是很合理,特别是在UserService有很多个方法需要做日志记录的时候,就会使得日志记录代码遍布整个UserService,不仅使得代码的冗余很大,而且当需要进行修改的时候,也需要逐个修改,非常麻烦,这个时候,采用动态代理技术就是一种非常好的方法了。

/**
 * UserService接口
 */
interface UserService{

  void login();
  void logout();
}

/**
 * UseService实现类
 */
class UserServiceImpl implements UserService{

  @Override
  public void login() {
    System.out.println("someone login....");
  }

  @Override
  public void logout() {
    System.out.println("someone logout....");
  }
}


/**
 * 实现InvocationHandle接口,用于织入所要增强的代码
 */
class UserServiceHandle implements InvocationHandler{

  private UserService userService;

  public UserServiceHandle(UserService userService) {
    this.userService = userService;
  }

  @Override
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

    LogService.info();
    Object object = method.invoke(userService, args);
    LogService.info();
    return object;
  }
}

/**
 * 代理类工厂,用于产生UseService类的代理类
 */
class ProxyFactory{

  public static UserService getProxyObject(UserService userService){

    // 使用JDK动态代理技术来创建对应的代理类
    return (UserService) Proxy.newProxyInstance(
        userService.getClass().getClassLoader(),
        userService.getClass().getInterfaces(),
        new UserServiceHandle(userService)
    );
  }
}

这样,当我们需要使用UseService类的时候,只需要从ProxyFactory中获取即可,而且获取的对象是UserService对象的代理类,也就是说,获得的对象是UserService对象的增强版

基于CGLib的动态代理技术

从上面的ProxyFactory工厂中可以看到,在使用JDK进行创建动态代理对象的时候,需要为其提供接口,或者说,如果所要增强的目标类没有实现任何接口,则JDK动态代理技术是无法为其创建对应的代理对象的,这是JDK动态代理技术的一种缺点,而CGLib动态代理技术则恰好弥补了这个缺点,CGLib动态代理技术使用的是继承该类的方式,从而避免了需要接口的缺陷,具体使用如下所示,注意,需要导入对应的依赖文件

/**
 * 基于CGLib的动态代理技术
 * 注意这里需要实现MethodInterceptor接口
 */
class ProxyFactory implements MethodInterceptor{

  // 提供对应的增强操作类
  private Enhancer enhancer = new Enhancer();

  public UserService getProxyObject(Class clazz){
    // 设置所要增强的类的父类
    enhancer.setSuperclass(clazz);
    // 设置回调对象
    enhancer.setCallback(this);
    // 创建对应的对象
    return (UserService) enhancer.create();
  }

  // 实现拦截方法,用于拦截对应的方法,并且对对应的方法进行增强
  // 参数含义:传入的对象, Method对象,方法的参数,进行代理后的Method对象
  @Override
  public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {

    LogService.info();
    // 这里需要注意,由于methodProxy对象是增强后的Method对象,所以这里需要调用的
    // 是methodProxy父类的方法,也就是所以增强的类的方法,以实现原来的功能
    Object object = methodProxy.invokeSuper(o, objects);
    LogService.info();
    return object;
  }
}

可以看到,使用CGLib动态代理技术可以在不需要实现接口的情况下东塔为对象创建代理对象,在很大程度上弥补了JDK动态代理技术的缺点,不过由于CGLib动态代理技术是采用继承目标类的方式,所以也存在一些问题,比如说,对于final以及private修饰的方法是无法为其增强的,这里还需要注意一下。

总结

动态代理技术是实现AOP技术的基础,也是一种很方便地实现方式,常用的动态代理技术有基于JDK动态代理技术以及基于CGLib的动态代理技术,两种技术各有千秋,也都各有缺点基于JDK的动态代理技术需要为其提供接口,基于CGLib的动态代理技术不能为final以及private修饰的方法进行增强,在使用的时候需要根据具体进行进行合理选择。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Spring  # 动态代理  # JDK动态代理  # CGLIB动态代理  # Java JDK与cglib动态代理有什么区别  # 详解Spring的两种代理方式:JDK动态代理和CGLIB动态代理  # Aop动态代理和cglib实现代码详解  # Spring之AOP两种代理机制对比分析(JDK和CGLib动态代理)  # 为其  # 所要  # 不需要  # 可以看到  # 重写  # 所示  # 这两种  # 主要是  # 的是  # 这是  # 情况下  # 就会  # 是在  # 是一种  # 会有  # 有个  # 将在  # 有很多  # 两种  # 而来 


相关文章: 建站之星如何快速生成多端适配网站?  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  建站之星后台搭建步骤解析:模板选择与产品管理实操指南  用v-html解决Vue.js渲染中html标签不被解析的问题  建站主机助手选型指南:2025年热门推荐与高效部署技巧  建站主机功能解析:服务器选择与快速搭建指南  如何在VPS电脑上快速搭建网站?  太平洋网站制作公司,网络用语太平洋是什么意思?  代购小票制作网站有哪些,购物小票的简要说明?  如何快速搭建支持数据库操作的智能建站平台?  网站制作的步骤包括,正确网址格式怎么写?  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  如何快速生成专业多端适配建站电话?  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  沈阳制作网站公司排名,沈阳装饰协会官方网站?  设计网站制作公司有哪些,制作网页教程?  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  如何通过cPanel快速搭建网站?  微课制作网站有哪些,微课网怎么进?  家庭服务器如何搭建个人网站?  自助网站制作软件,个人如何自助建网站?  大连网站设计制作招聘信息,大连投诉网站有哪些?  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  上海网站制作开发公司,上海买房比较好的网站有哪些?  建站VPS配置与SEO优化指南:关键词排名提升策略  完全自定义免费建站平台:主题模板在线生成一站式服务  如何在宝塔面板中创建新站点?  如何快速重置建站主机并恢复默认配置?  建站主机选择指南:服务器配置与SEO优化实战技巧  网站制作网站,深圳做网站哪家比较好?  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  制作企业网站建设方案,怎样建设一个公司网站?  制作网站的基本流程,设计网站的软件是什么?  如何快速生成高效建站系统源代码?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  建站之星如何取消后台验证码生成?  ,网页ppt怎么弄成自己的ppt?  如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法  广州顶尖建站服务:企业官网建设与SEO优化一体化方案  微信小程序 五星评分(包括半颗星评分)实例代码  建站主机选购指南:核心配置与性价比推荐解析  建站之星在线版空间:自助建站+智能模板一键生成方案  如何在新浪SAE免费搭建个人博客?  网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何配置IIS站点权限与局域网访问?  建站IDE高效指南:快速搭建+SEO优化+自适应模板全解析  如何通过虚拟主机快速搭建个人网站?  三星网站视频制作教程下载,三星w23网页如何全屏?  小程序网站制作需要准备什么资料,如何制作小程序? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。