SpringBoot2为什么默认使用CGLib不再使用JDK动态代理

2023-11-07


在这里插入图片描述

CGLib和JDK动态代理对比

1. 不需要实现接口

JDK动态代理类要求目标类必须实现接口,而CGLib动态代理可以直接代理普通类(非接口),这为对那些没有接口的类进行代理提供了极大的灵活性.

2. 性能

CGlib动态代理比JDK动态代理更快,JDK动态代理是通过反射来实现的,而CGLib动态代理是使用字节码生成技术,直接操作字节码,因此CGLib性能更高.

3. 代理对象的创建

JDK动态代理只能代理实现了接口的类,它是通过Proxy类和InvocationHandler接口来创建代理对象.而CGLib动态代理可以代理任意类(final修饰的类和fina修饰的方法除外),它是通过Enhancer类来创建代理对象,无需接口.

4. 调用方法

JDK动态代理对代理方法的调用是通过InvocationHandler来转发的,而CGLib动态代理是对代理方法通过FastClass机制来直接调用目标方法的,这也是CGLib性能较高的原因之一.

2. CGLib使用

  • 引入CGLib依赖
<dependency>
     <groupId>cglib</groupId>
     <artifactId>cglib</artifactId>
     <version>3.3.0</version>
 </dependency>
  • 目标类
@Service
@RequiredArgsConstructor
public class UserService {

    private final UserMapper userMapper;
    public User findById(Long id){
        System.out.println("findById()...");
        return userMapper.findById(id);
    }
}
  • 使用
    @Test
    public void cglibCase(){
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(UserService.class);
        enhancer.setCallback(new MethodInterceptor() {
            @Override
            public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
                System.out.println("前置增强");
                Object o = proxy.invokeSuper(obj, args);
                System.out.println("后置增强");
                return o;
            }
        });

        UserService userService = (UserService) enhancer.create(new Class[]{UserMapper.class},new Object[]{userMapper});
        System.out.println(userService.findById(2L));
    }

在这里插入图片描述

由于目标类没有空参构造方法,使用Enhancer中create()需要传入代理方法的参数类型和参数,不然会报一下错误
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot2为什么默认使用CGLib不再使用JDK动态代理 的相关文章

随机推荐

  • 嵌入式监控【v4l2采集->vpu编码->live555推流】

    嵌入式监控 v4l2采集 gt vpu编码 gt live555推流 文章目录 嵌入式监控 v4l2采集 gt vpu编码 gt live555推流 介绍 数据流图 一 v4l2 1 1 确定cam的输出格式 1 2 YUYV 转 YUV4
  • 【机器学习系列】如何将多条ROC曲线画在一张图里,并解决文本遮挡问题

    有的时候我们需要将ROC曲线输出在同一张图中 这样可以更加直观地对比模型 并且我们常常会遇到在图形中有文字相互遮挡的问题 我们可以用adjustText中的adjust text来实现文本不相互遮挡并添加箭头的功能 定义多条roc曲线画图函
  • 股票交易系统的服务器,股标交易传输系统

    本词条缺少概述图 补充相关内容使词条更完整 还能快速升级 赶紧来编辑吧 股标交易传输系统在Windows 环境下将原有的传输和显示系统进行改进 使它们在 Windows 环境下可以并发执行 而且可以和其它应用 程序协调地共享资源 这不仅实现
  • 基于labview实现MYSQL数据库查询功能

    前言 labview是一款功能强大的图形化编程软件 也就是俗称的G语言 本篇将介绍如何利用labview对MYSQL进行列表分页 范围查询及模糊查询等几个可广泛应用的简易功能 但事实上labview并不擅长处理数据库 下面详细代码可体现 数
  • spring-boot,java 微服务,跨域配置

    只需要在启动类下面与run方法同级加上下面那串代码即可 public static void main String args SpringApplication run ApplicationService class args Over
  • Visual Studio 2019中使用Qt,步骤详解

    本文学习的目的就是在Visual Studio 2019环境下能够顺利的运行Qt程序 下面是一些具体的配置安装过程 首先 打开visual Studio 2019 继续但无需代码 如图 然后点击扩展 管理扩展 在搜索框中搜索Qt 点击下载插
  • 上个厕所的功夫,就把定时任务的三种调度策略说得明明白白

    Spring Task 无疑是 Spring 环境下单机定时任务的首选 它用起来非常简单 功能也够用 Spring Task 有三种模式 分别是 fixedDelay cron 和 fixedRate 话不多说 我们先看代码 Slf4j C
  • JUC多线程及高并发

    文章目录 1 对volatile的理解 2 CAS 3 原子类AtomicInteger的ABA问题 原子更新引用 4 ArrayList线程不安全的案例 5 公平锁 非公平锁 可重入锁 递归锁 自旋锁 6 CountDownLatch C
  • SpringBoot支付宝沙箱支付步骤

    步骤1 注册一个沙箱号 网站https open alipay com platform home htm 使用自己真实的支付宝扫描进去 进行注册沙箱支付宝 步骤2 下载密匙生成工具 下载完毕 解压 双击运行 网址 https opendo
  • 重磅:国产IDE发布,由阿里研发,完全开源!​(高性能+高定制性)

    经历近 3 年时间 在阿里集团及蚂蚁集团共建小组的努力下 OpenSumi 作为国内首个强定制性 高性能 兼容 VS Code 插件体系的 IDE 研发框架 今天正式对外开源 1 OpenSumi 是什么 OpenSumi 是一款面向垂直领
  • Lua点号和冒号区别

    定义的时候冒号默认接收self参数 调用的时候冒号默认传递调用者自己为参数 而句号要显示传递或接收self参数 例如 句号定义 需要显示传递或接收 plain view plain copy a x 1 function a fun sel
  • Python画QQ图检验正态分布

    import numpy as np import seaborn as sns import matplotlib pyplot as plt from statsmodels graphics api import qqplot sns
  • pip 安装 sklearn or scikit-learn python3

    安装 sklearn 1 安装 numpy scipy matplot pip3 install numpy scipy matplotlib i https pypi tuna tsinghua edu cn simple 2 安装 sk
  • Android序列化:Serializable Parcelable

    Android序列化完全解析 一 Java Serializable http http www jianshu com p fcc59fb523b6 Android序列化完全解析 二 Parcelable http www jianshu
  • 背对背mos管开关_10天电子入门-MOS管

    1 MOS管介绍 在各大IT企中我们把场效应管 FET 统称为MOS管 其作用是把输入电压的变化转化为输出电流的变化 FET的增益等于它的跨导 定义为输出电流的变化和输入电压变化之比 市面上常有的一般为N沟道和P沟道 它属于电压控制型半导体
  • uni-app 之 解决u-button始终居中问题

    uView中u button始终居中问题如何解决的简单方法 1 给该元素margin right 0 可以达到向右靠齐 2 给该元素的父元素设置float right image png
  • DF-GAN: A Simple and Effective Baseline for Text-to-Image Synthesis论文解读

    题目 DF GAN 一种简单有效的文本 图像合成基线 时间 2022 CVPR Abstract 从文字描述中合成高质量的逼真图像是一项具有挑战性的任务 现有的文本 图像生成对抗网络通常采用堆叠架构作为主干 但仍存在三个缺陷 首先 分层结构
  • open3d,读取stl/ply/obj/off/gltf/glb三维模型,并转换成点云,保存

    1 三维模型获取 可以自己用建模软件建立一个模型 本案例使用模型的下载地址 可以从free3d免费下载 无需注册 2 导入open3d import open3d as o3d 3 open3d模型读取与可视化 模型路径 支持后缀 stl
  • vim编辑器-设置默认行号和高级用法

    vim 自动显示行号 编辑 etc vim vimrc文件 在最后加上两句 完事ok 注 set nu 显示行号 set tabstop 4 设置缩进 set nonumber取消行号 set nu set tabstop 4 vim的高级
  • SpringBoot2为什么默认使用CGLib不再使用JDK动态代理

    SpringBoot2为什么默认使用CGLib不再使用JDK动态代理 CGLib和JDK动态代理对比 1 不需要实现接口 2 性能 3 代理对象的创建 4 调用方法 2 CGLib使用 CGLib和JDK动态代理对比 1 不需要实现接口 J