BeanUtils和BeanCopier性能复制Bean工具比较

news2025/1/18 12:02:31

文章目录

  • 一、前言
  • 二、实验
  • 三、原理
    • 1、BeanUtils
    • 2、BeanCopier
  • 四、总结

一、前言

我们本篇比较的是复制Bean对象的工具,分别是org.springframework.beans.BeanUtils和 net.sf.cglib.beans.BeanCopier

二、实验

在这里插入图片描述

import net.sf.cglib.beans.BeanCopier;
import org.springframework.beans.BeanUtils;

Forlan sourceForlan = new Forlan));
Forlan targetForlan = new Forlan();

// BeanCopier复制
BeanCopier copier = BeanCopier.create(sourceForlan.getClass(), targetForlan.getClass(), false);
copier.copy(sourceForlan, targetForlan, null);

// BeanUtils复制
BeanUtils.copyProperties(sourceForlan, targetForlan);

在这里插入图片描述

从上面的结果可以看出:

  • 两者在首次执行都比较,是因为需要进行一些初始化操作
  • 除了10W级别的数据量,BeanCopier稍微慢点,其它量级基本都是它领先

三、原理

1、BeanUtils

BeanUtils的复制原理是基于Java的反射机制。它通过使用反射来获取源对象和目标对象的属性信息,并使用反射来设置目标对象的属性值。

具体而言,BeanUtils会使用反射来获取源对象和目标对象的属性名称和类型。然后,它会通过反射来获取源对象的属性值,并使用反射来设置目标对象的属性值。

在复制过程中,BeanUtils会遍历源对象的属性,并使用反射来获取每个属性的值。然后,它会使用反射来设置目标对象的对应属性的值。
由于BeanUtils使用了反射机制,它的复制过程相对较慢。每次复制都需要通过反射来获取和设置属性值,这会带来一定的性能开销。

2、BeanCopier

BeanUtils的复制原理是基于字节码生成技术。在首次执行时,BeanCopier会通过分析源对象和目标对象的属性,动态生成复制代码,并将其编译成字节码。这种字节码生成的方式避免了使用反射机制,从而提高了复制的性能。

通过生成的字节码,BeanCopier可以直接访问对象的属性,而无需通过反射来获取和设置属性值。这样可以大大减少了方法调用和属性访问的开销,从而提高了复制的速度。

此外,BeanCopier还可能使用一些缓存或优化策略来进一步提高复制的性能。例如,它可以缓存已生成的复制代码,以便在后续的复制操作中直接复用,而无需再次生成。

总的来说,BeanCopier通过使用字节码生成和优化策略,能够在复制过程中实现较高的性能,从而快速地完成对象复制操作。

四、总结

BeanUtils:

  • 缺点:复制过程相对较慢
  • 优点:具有灵活性和通用性,可以处理不同类型的对象和复杂的属性结构。它不需要事先生成复制代码,而是在运行时动态地进行属性的复制操作。

BeanCopier:

  • 优点:速度快
  • 缺点:占用空间,无法处理复杂的情况

总的来说,建议在复制大型Bean对象时优先考虑使用BeanCopier。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1416464.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

部署LNMP、Nginx+FastCGI、Nginx地址重写语法,地址重写应用案例

1 案例1:部署LNMP环境 1.1 问题 安装部署LNMP环境实现动态网站解析 静态网站 在不同环境下访问,网站内容不会变化 动态网站 在不同环境下访问,网站内容有可能发生变化 安装部署Nginx、MariaDB、PHP、PHP-FPM;启动Nginx、Mari…

java—AWT

AWT 课程:1、GUI编程简介_哔哩哔哩_bilibili 一.介绍 包含了很多类和接口!GUI!元素:窗口、按钮、文本框java.awt 二.窗口 1.构造 2.方法 // 实例化frame类Frame frame new Frame("这个一个框");// 设置可见性frame.…

游戏设计模式

单列模式 概念 单例模式是一种创建型设计模式,可以保证一个类只有一个实例,并提供一个访问该实例的全局节点。 优点 可以派生:在单例类的实例构造函数中可以设置以允许子类派生。受控访问:因为单例类封装他的唯一实例&#xf…

Cyberdog2 docker环境软件源无法被验证问题

搭建docker系统后更新软件源sudo apt-get update出现异常 经过查询GPT,使用如下方式成功解决 从keyserver.ubuntu.com获取缺失的公钥,并添加到apt-key中。具体命令如下: gpg --keyserver keyserver.ubuntu.com --recv-keys F42ED6FBAB17C6…

C++的关键字,命名空间,缺省参数,函数重载以及原理

文章目录 前言一、C关键字(C98)二、命名空间命名空间介绍命名空间的使用 三、C输入【cin】& 输出【cout】四、缺省参数缺省参数概念缺省参数分类缺省参数的使用小结一下 五、函数重载函数重载介绍函数重载类型 六、C支持函数重载的原理--名字修饰(name Mangling)【重点】 前…

【开源】基于JAVA语言的智慧社区业务综合平台

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 业务类型模块2.2 基础业务模块2.3 预约业务模块2.4 反馈管理模块2.5 社区新闻模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 业务类型表3.2.2 基础业务表3.2.3 预约业务表3.2.4 反馈表3.2.5 社区新闻表 四、系统展…

[BUUCTF]-PWN:hitcon2014_stkof解析

又是一道堆题,先看保护 关键信息,64位,没开pie。再看ida 大致就是alloc创建堆块,free释放堆块,fill填充堆块内容,以及一个看起来没啥用的函数,当然我也没利用这个函数去解题 这里有两种解法 解…

Python tkinter (6) Listbox

Python的标准Tk GUI工具包的接口 tkinter系列文章 python tkinter窗口简单实现 Python tkinter (1) —— Label标签 Python tkinter (2) —— Button标签 Python tkinter (3) —— Entry标签 Python tkinter (4) —— Text控件 GUI 目录 Listbox 创建listbox 添加元素…

Java版大厂算法题1——数字颠倒

问题描述 输入一个整数&#xff0c;将这个整数以字符串的形式逆序输出&#xff0c;程序不考虑负数的情况&#xff0c;若数字含有0&#xff0c;则逆序形式也含有0。如果输入为100&#xff0c;则输出为001。 数据范围&#xff1a;0<n<(2^30)-1 * 输入描述&#xff1a;输入…

2023启示录|虚拟人这一年

图片&#xff5c;《银翼杀手 2049》剧照 作者丨程心 编辑丨罗辑 2023 年&#xff0c;大模型 “救活” 了很多行业&#xff0c;其中最为反转的&#xff0c;就是把虚拟数字人&#xff08;以下简称虚拟人&#xff09;从活死人墓里拉了出来。 还没开年&#xff0c;在 2022 年火…

保姆级教学:Java项目从0到1部署到云服务器

目录 1、明确内容 2、apt 2.1、apt 语法 2.2、常用命令 2.3、更新apt 3、安装JDK17 4、安装MySQL 4.1、安装 4.2、检查版本及安装位置 4.3、初始化MySQL配置⭐ 4.4、检查状态 4.5、配置远程访问⭐ 4.6、登录MySQL 4.7、测试数据库 4.8、设置权限与密码⭐ 5、安…

基于Python flask MySQL 猫眼电影可视化系统设计与实现

1 绪论 1.1 设计背景及目的 猫眼电影作为国内知名的电影信息网站&#xff0c;拥有海量的电影信息、票房数据和用户评价数据。这些数据对于电影市场的研究和分析具有重要意义。然而&#xff0c;由于数据的复杂性和数据来源的多样性&#xff0c;如何有效地采集、存储和展示这些数…

0127-2-Vue深入学习5—Vue-Router路由模式

1、Vue-Router三种路由模式&#xff1a; hash&#xff1a;#️⃣使用URL hash 值来做路由&#xff0c;支持所有路由器&#xff1b;history:&#x1f4d6;依赖HTML5 History API和服务器配置&#xff1b;abstract:⛓支持所有JS运行环境&#xff0c;Node.js服务端&#xff1b; 1.1…

基于springboot+vue+mysql+mybatis的博客系统源码+数据库

pb-cms 介绍 博客系统&#xff0c;架构&#xff1a;springbootvuemysqlmybatis 软件架构 软件架构说明 系统截图 技术选型 技术版本说明Spring Boot2.1.6MVC核心框架Spring Security oauth22.1.5认证和授权框架MyBatis3.5.0ORM框架MyBatisPlus3.1.0基于mybatis&#xff0…

HCIA-HarmonyOS设备开发认证-3.内核基础

目录 前言目标一、进程与线程待续。。。 前言 对于任何一个操作系统而言&#xff0c;内核的运行机制与原理是最为关键的部分。本章内容从多角度了解HarmonyOS的内核运行机制&#xff0c;涵盖进程与线程的概念&#xff0c;内存管理机制&#xff0c;网络特性&#xff0c;文件系统…

高级CPU(提高CPU运行速度)

晶体管 早期是加快晶体管切换速度,来提升CPU速度 增加电路 给CPU专门的除法电路其他电路来做复杂操作 缓存&#xff08;cache&#xff09; 给CPU加缓存&#xff08;cache&#xff09;,提高数据存取速度,更快送给CPU&#xff0c;因为处理器里空间不大所以缓存一般只有KB或M…

BGP:03 BGP路由

这是实验拓扑&#xff0c;IBGP 利用环回口建立邻居&#xff0c;IGP 协议为 OSPF&#xff0c; EBGP 通过物理接口建立邻居 基本配置&#xff1a; R1: sys sysname R1 int loop 0 ip add 1.1.1.1 24 int g0/0/0 ip add 192.168.12.1 24 qR2: sys sysname R2 int loop 0 ip ad…

基于SSM的网络办公系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的网络办公系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Spri…

c语言基础6

1.逗号表达式 逗号表达式&#xff0c;就是用逗号隔开的多个表达式。 逗号表达式&#xff0c;从左向右依次执行。整个表达式的结果是最后⼀个表达式的结果。 我们来看下面的一个代码&#xff1a; int main() {int a 1;int b 2;int ret (a > b, a b 2, b, b a 1);p…

shell脚本基础之函数与数组详解

目录 一、shell函数 1、shell函数的概念 2、shell函数的用法 2.1 定义函数 2.2 调用函数 2.3 函数作用范围 2.3.1 调用函数的范围 2.3.2 全局作用域和局部作用域 3、 函数返回值 3.1 系统默认的返回值 3.2 return语句 4、函数传参 5、查看函数列表 6、删除函数 …