【业务功能篇71】Cglib的BeanCopier进行Bean对象拷贝

01 AUTOSAR CP标准文档阅读指南 阅读详情

选择Cglib的BeanCopier进行Bean拷贝的理由是,
其性能要比Spring的BeanUtils,Apache的BeanUtils和PropertyUtils要好很多,
尤其是数据量比较大的情况下。

  • BeanCopier的主要作用是将数据库层面的Entity转化成service层的POJO。BeanCopier其实已经有很多开源版本,例如DozerMapper、Apache BeanUtils、Spring、Jodd BeanUtils甚至是Cglib都提供了这样的功能。我们这里讲的BeanCopier来自net.sf.cglib.BeanCopier包,cglib是一款比较底层的操作java字节码的框架。 而其他多数都是基于 反射 来实现的 对象复制,所以更底层的字节码方式获取数据赋值,效率会更高
  • 顾名思义,BeanCopier是用于在两个bean之间进行属性拷贝的。BeanCopier支持两种方式,一种是不使用Converter的方式,仅对两个bean间属性名和类型完全相同的变量进行拷贝。另一种则引入Converter,可以对某些特定属性值进行特殊操作。

简单用例 


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.cglib.beans.BeanCopier;
import org.springframework.cglib.core.Converter;
 
import java.math.BigDecimal;
 
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
 
import static org.junit.jupiter.api.Assertions.*;
 
class BeanCopyUtilsTest {
 
    /**
     * 测试说明: 类型不同BeanCopier不会拷贝
     */
    @Test
    void copy() {
        User user = new User();
        user.setId(1);
        user.setName("dearth");
        BeanCopier copier = BeanCopier.create(User.class, UserVo.class, false);
        UserVo userVo = new UserVo();
        copier.copy(user, userVo, null);
        Assertions.assertNull(userVo.getId());
    }
 
    /**
     * 测试说明: 提供转换器可以实现不同类型的拷贝
     */
    @Test
    void copyUseConverter() {
        User user = new User();
        user.setId(1);
        user.setName("dearth");
        user.setCreateTime(new Timestamp(10043143243L));
        user.setBalance(BigDecimal.valueOf(4000L));
        BeanCopier copier = BeanCopier.create(User.class, UserVo.class, true);
        UserVo vo = new UserVo();
        copier.copy(user, vo, new UserConverter());
        Assertions.assertNotNull(vo.getCreateTime());
        Assertions.assertNotNull(vo.getBalance());
    }
 
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    static
    class User {
        private String name;
        private int id;
        private Timestamp createTime;
        private BigDecimal balance;
    }
 
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    static
    class UserVo {
        private String name;
        private Integer id;
        private String createTime;
        private String balance;
    }
 
    static class UserConverter implements Converter {
 
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 
        @Override
        public Object convert(Object o, Class aClass, Object o1) {
            if (o instanceof Integer) {
                return (Integer) o;
            } else if (o instanceof Timestamp) {
                Timestamp data = (Timestamp) o;
                return sdf.format(data);
            } else if (o instanceof BigDecimal) {
                BigDecimal bg = (BigDecimal) o;
                return bg.toPlainString();
            } else {
                 return null;
            }
        }
    }
}

 

  1. BeanCopier只拷贝名称和类型都相同的属性。
  2. 当目标类的setter数目比getter少时,创建BeanCopier会失败而导致拷贝不成功。
  3. 自定义Converter转换器可以转换不同类型的属性

 

8.30华为OD机试真题 新系统 - 单词搜索计数 (Java/Py/C/C++/Js/Go) 8.30华为OD机试真题 新系统 - 单词搜索计数 (Java/Py/C/C++/Js/Go) 阅读详情

相关推荐

二次规划问题(qp)和序列二次规划问题(sqp)的简单理解

当二次规划的约束为非线性约束时,通常会采用sqp进行求解,用连续求解qp的方法来得到非线性约束条件下的最优解,上述的qpoases和osqp均无法直接求解非线性约束问题,所以如果使用这两个库的话,注意,sqp是结果,而不是原因,只有在非线性约束的情况下才会考虑sqp求解,如果问题本身就是线性约束,则直接用qp解就行。对于工程师而言,我们在编写代码的时候,并不关心二次规划问题的求解细节,所以一般是把二次规划问题建立好后,直接调用三方库进行求解。因为约束为非线性约束,所以先将约束进行线性化,约束原方程为。

zmhzmhzm的博客 1万+

Spring学习笔记(二)【CGLIB浅拷贝BeanCopier的使用和详解】

常用的bean拷贝工具类当中,主要有Apache提供的beanUtils、Spring提供的beanUtils、Cglib提供的beanCopier,性能上分析如下表所示

Vinjcent 7498

快手did did_gt edid的注册过程

接口 https://gdfp.ksapisrv.com/rest/infra/gdfp/report/kuaishou/android did 是本地生成的16进制 或者 获取的 android_id did_gt 是did生成时间戳 1595073601970 public static final Random f16237a = new Random(System.currentTimeMillis()); public static long m19668a() {  &n

HURUWO的技术博客 1万+

【Java对象拷贝机制】「实战开发专题」高性能使用CGlib实现Bean拷贝(BeanCopier)指南

都使用静态类调用,最终转化虚拟机中两个单例的工具对象。}ConvertUtilsBean可以通过ConvertUtils全局自定义注册。PropertyUtilsBean的copyProperties方法实现了拷贝的算法。然后把value复制到动态bean类。:key值逐个拷贝其他普通类:从beanInfo【每一个对象都有一个缓存的bean信息,包含属性字段等】取出name,然后把sourceClass和targetClass逐个拷贝。

世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程。 6067

Synares病毒实战:如何从U盘感染中恢复你的Excel和EXE文件(附专杀工具推荐)

本文详细介绍了Synares感染型病毒的典型特征与传播机制,特别是其通过U盘感染Excel和EXE文件的行为。文章提供了一套从应急隔离、诊断到使用专杀工具进行深度清除与文件恢复的完整实战流程,并推荐了有效的安全软件和修复方法,旨在帮助用户最大程度救回重要数据并构建长效安全防护习惯。

weixin_29230649的博客 1818

【Zephyr存储专题】09_LittleFs文件系统操作

本文档旨在为开发者介绍Zephyr下Littlef's文件系统相关配置使用指南

zero的博客 3246

使用CGlib实现Bean拷贝(BeanCopier)

目录 BeanCopier基本用法 自定义转换器 封装BeanCopier   在做业务的时候,我们有时为了隔离变化,会将DAO查询出来的Entity,和对外提供的DTO隔离开来。大概90%的时候,它们的结构都是类似的,但是我们很不喜欢写很多冗长的b.setF1(a.getF1())这样的代码,于是我们需要BeanCopier来帮助我们。选择Cglib的BeanCopier进行Bean...

bingguang1993的博客 1839

【异常】OpenClaw 项目 `fetch failed` 报错问题排查与解决方案Response interrupted: TypeError: fetch failed

针对无超时控制、异常兜底缺失导致的请求中断,封装标准化的安全请求工具,一次性解决超时控制、异常捕获、日志埋点三大问题,全项目替换原生。:将项目运行的 Node.js 版本升级至 18.x 及以上 LTS 版本,使用 Node.js 内置的稳定版。实现的网络请求环节,包括但不限于:第三方开放接口调用、内部服务接口通信、跨域资源请求、外部配置拉取等场景。:针对无法升级 Node.js 版本的存量环境,通过社区稳定兼容包替换原生。类型异常,直接造成业务请求响应中断。第二步:业务代码改造,替换原生。

奶爸的编程之路,也就一周冷个三天 367

BeanCopier

BeanCopier是Cglib包中的一个类,用于对象的复制。 net.sf.cglib.beans.BeanCopier 使用: BeanCopier copier = BeanCopier.create(Source.class, Target.class, false); copier.copy(source, target, null); public static BeanCopier beanCopier = BeanCopier.create(User.class, UserWithD

weixin_44637905的博客 809

ABAP CDS View 从入门到精通教程目录:ABAP CDS View 在 SAP 技术体系中的重要地位

学习 ABAP CDS View 的开发技术,体会其背后的设计理念,也就掌握了 SAP S/4HANA 底层数据模型的设计精髓。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 4776

3D 韩系风格漫剧人设 | GPT-Image2 人设生成【附完整提示词】

宁姚同款清冷剑系美人,极致小巧鹅蛋脸,下颌线紧致纤细流畅,下巴小巧精致收窄,小脸衬得五官格外舒展,韩式水光肌,面部精细水光高光,鼻梁高光、鼻尖高光、面中苹果肌高光、唇珠高光,红棕色长卷发偏分大波浪,垂在一侧肩前,发量蓬松。发量丰厚蓬松有体积感,不贴头皮,几缕碎发自然垂落脸侧修饰脸型,长度过胸及背,发丝柔顺丝滑卷度自然,发尾自然垂落,身穿香槟色缎面挂脖长裙,挂脖设计无袖露肩露背,上半身围裹式荡领胸口垂褶,腰部堆褶收腰,修身直筒包臀裙长度到脚踝,缎面光泽感强垂坠感好,极简剪裁。纯白色背景,3D漫剧写实厚涂风。

欢迎来到鸾姝淡月博客,专为程序员和编程爱好者打造的技术博客。我们分享编程语言趋势、开发工具、编程哲学、职业发展等,助你掌握新技术,优化技能,激发编程热情。 130

Java对象复制之Cglib和mapstruct讲解

BeanCopier是Cglib包中的一个类,用于对象的复制。 注意:目标对象必须先实例化 而且对象必须要有setter方法 示例: BeanCopier copier = BeanCopier.create(Source.class, Target.class, false); copier.copy(source, target, null); 第三个参数useConver...

上善若泪 3132

毕设帮扶:从0到1搭建基于YOLOv5的打架斗殴检测系统——助你搞定深度学习毕设

做完这个毕设,你已经掌握了从数据准备到模型部署、界面开发的全流程。把模型部署到边缘设备(如安防摄像头的嵌入式系统)上,实现本地化实时检测与报警;加入行为严重程度分析(如轻微推搡 vs 严重斗殴)、涉事人员数量统计,让系统从“检测”升级为“智能安防决策”;尝试融合声音、红外等多模态数据,打造全方位的暴力事件监测系统。按照这个教程一步步做,你的毕设肯定能做得很扎实。要是过程中遇到啥问题,别担心,慢慢梳理或者咱们一起聊聊,一定能把这个毕设做成你满意的作品。

LXY_LOVE36的博客 119

cglib 的BeanCopier高性能解密

在一些系统代码中,随处可见的BeanCopier(源于org.springframework.cglib.beans),它主要用在将PO与DTO互转。一些人在惊叹它的高性能的同时,不曾了解它的实现原理(它不使用的反射)!它基于CGLIB代理,CGLIB(Code Generation Library)是高效的代码生成包,底层依靠ASM(开源的Java字节码编辑类库)操作字节码实现。 JDK动态代...

布道 6281

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

net.sf.cglib.beans.BeanCopier用途

1.当把对象放到map中以后,修改对象内容,一样会影响对象的属性的值 import java.util.HashMap; import java.util.Map; public class TTTT { public static void main(String[] args) { Person p1 = new Person("zhangsan", 10); Map map

shuwei003的专栏 1万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

更快的BeanUtil(对比BeanUtils,Cglib)

可能是最好用的BeanUtil(吹牛的) BeanUtil算是个高频使用工具类了,很多地方都用得到,大家常用的BeanUtil大概有Spring的BeanUtils以及cglib的BeanCopier,前者使用反射进行getter、setter方法调用,后者使用CGLIB代理直接操作字节码调用getter、setter方法。 BeanCopier的性能要高出Spring的BeanUtils很多,我实测大概有5倍多的差距,但是BeanCopier用起来也更加繁琐一些,需要先传入source类和target类创

ZDLW5的博客 3878

用 cglib 的 BeanCopier 替换其他工具的 BeanUtils 来减少你的 Bean 拷贝时间

Bean 拷贝的工具有很多,有 Apache BeanUtils、Spring BeanUtils、Mapstruct、cglib BeanCopier 等等Apache 和 Spring 的 BeanUtils 效率并不是我想要的,而使用 Mapstruct 又太繁琐了那有没有简单易用的,而且效率还比较高的呢?这就是我这篇文章要讲述的主要内容。

Eighteen_y的博客 628

利用cglib的BeanCopier用原型模式以及享元模式完成对象的拷贝

实际上对象拷贝的工具有很多种,比如apache BeanUtils、apache PropertyUtils、spring BeanUtils。在一些业务代码中现在经常看到的都是spring BeanUtils来进行对象拷贝。大部分情况下来说已经足够了,但如果居于性能考虑,以上几种工具都是利用反射的原理来完成的,性能相比cglib beanCopier利用动态代理实现稍差一筹,这里不去对比几种工具的性能,只展示BeanCopier如何进行使用。 一、非cglib下的对象拷贝方式 1、原型模式就是从一

码工 829

对象拷贝类

对象拷贝类较流行工具类 PropertyUtils,BeanUtils,BeanCopier:

bwf1234的专栏 1329

BeanCopier的使用

【代码】BeanCopier的使用。

weixin_43860634的博客 4006

java中import org.springframework.cglib.beans.BeanCopier;和import cn.hutool.core.convert.Convert;用Bean

java中import org.springframework.cglib.beans.BeanCopier; 和import cn.hutool.core.convert.Convert;用BeanCopier和Convert那个复制list数据比较好呢?

gb4215287的博客 756

使用Cglib的BeanCopier实现Bean的拷贝

选择Cglib的BeanCopier进行Bean拷贝的理由是,其性能要比Spring的BeanUtils,Apache的BeanUtils和PropertyUtils要好很多,尤其是数据量比较大的情况下。 伦理片 http://www.dotdy.com/        下面看具体例子: Java代码   package com.yusj.utils

dotedy的博客 2753

java beanutils 性能_spring的BeanUtils和cglib的BeanCopier性能比较

测试环境:JDK1.6.29CPU:I7 2.80 双核四线程单位为纳秒测试对象1)spring包中的 BeanUtil 采用反射实现2)cglib包中的 Beancopier 采用动态字节码实现1.对象包含所有的基本类型public class TestBeanSource1 {private String str;private byte ...

weixin_33565515的博客 832

spring的BeanUtils和cglib的BeanCopier性能比较

  测试环境: JDK1.6.29 CPU:I7 2.80 双核四线程 单位为纳秒 测试对象    1)spring包中的 BeanUtil     采用反射实现 2)cglib包中的  Beancopier   采用动态字节码实现     1.对象包含所有的基本类型  public class TestBeanSource1 {       private Strin...

知行天下 2192

Java Bean 映射工具(浅复制)

javabean映射工具、beanutils如何使用、mapstruct如何使用

一名后端程序猿 5844

cglib BeanCopier性能优化:5倍效率提升的秘诀

cglib BeanCopier 是 Java 字节码生成库中强大的对象复制工具,通过动态生成字节码实现高性能的属性拷贝。相比传统的反射复制,BeanCopier 能够实现高达5倍的性能提升,成为企业级应用中的首选解决方案。😊 ## 🔥 为什么BeanCopier性能如此出色? BeanCopier 的核心优势在于它绕过了Java反射机制,直接在字节码层面生成高效的属性复制代码。当您调用

gitblog_00935的博客 498

深拷贝的缺点_使用cglib进行bean拷贝

点赞收藏加关注是我创作的最大动力大家可能用过很多种方式拷贝bean,一开始阿帕奇的BeanUtil,Spring里的BeanUtil、MapStruct等等,种类繁多,它们各有各的实现方式,有的是通过反射,有的是生成映射,有的是生成字节码。可以说,每种方式各有各的优缺点(意思就是我不评价它们好坏),今天我只说cglib中的BeanCopier,它有什么特点呢:生成字节码,生成调用set get的方...

weixin_39815879的博客 714
上一篇: 【业务功能篇70】可重入锁与不可重入锁
下一篇: 【业务功能篇72】分布式锁实现分析
studyday1
博客等级 码龄9年 6454粉丝 255原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值