SpringBoot2.0 使用cglib beancopier 进行不同层次的对象转换

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

大家在做wb开发时,肯定会遇到api层参数对象传递给服务层,或者把service层的对象传递给dao层,他们之间又不是同一个类型对象,但字段又是一样,如果还是用普通的get、set方式来处理话,比较繁琐,其中有篇博文讲过使用easymapper来进行对象映射,但在项目中存在不稳性,偶尔出现映射不上的问题,报异常
com.baidu.unbiz.easymapper.exception.MappingException: Generating mapping code failed for ClassMap([A]:Person, [B]:PersonDto), this should not happen, probably the framework could not handle mapping correctly based on your bean
所以使用效率比纯的get和set方法还高的的cglib beancopier,虽然的它的拓展性没有easymapper强,但用来作为对象的copy足够了。
首先导入pom依赖

 <dependency>
            <groupId>asm</groupId>
            <artifactId>asm</artifactId>
            <version>3.3.1</version>
        </dependency>
        <dependency>
            <groupId>asm</groupId>
            <artifactId>asm-commons</artifactId>
            <version>3.3.1</version>
        </dependency>
        <dependency>
            <groupId>asm</groupId>
            <artifactId>asm-util</artifactId>
            <version>3.3.1</version>
        </dependency>
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib-nodep</artifactId>
            <version>2.2.2</version>
        </dependency>

工具类

public class CGlibMapper {
     //使用缓存提高效率
    private static final ConcurrentHashMap<String, BeanCopier> mapCaches = new ConcurrentHashMap<>();

    public static <O, T> T mapper(O source, Class<T> target) {
        T instance = baseMapper(source, target);
        return instance;
    }

    public static <O, T> T mapper(O source, Class<T> target, IAction<T> action) {
        T instance = baseMapper(source, target);
        action.run(instance);
        return instance;
    }

    public static <O, T> T mapperObject(O source, T target) {
        String baseKey = generateKey(source.getClass(), target.getClass());
        BeanCopier copier;
        if (!mapCaches.containsKey(baseKey)) {
            copier = BeanCopier.create(source.getClass(), target.getClass(), false);
            mapCaches.put(baseKey, copier);
        } else {
            copier = mapCaches.get(baseKey);
        }
        copier.copy(source, target, null);
        return target;
    }

    public static <O, T> T mapperObject(O source, T target, IAction<T> action) {
        String baseKey = generateKey(source.getClass(), target.getClass());
        BeanCopier copier;
        if (!mapCaches.containsKey(baseKey)) {
            copier = BeanCopier.create(source.getClass(), target.getClass(), false);
            mapCaches.put(baseKey, copier);
        } else {
            copier = mapCaches.get(baseKey);
        }
        copier.copy(source, target, null);
        action.run(target);
        return target;
    }

    private static <O, T> T baseMapper(O source, Class<T> target) {
        String baseKey = generateKey(source.getClass(), target);
        BeanCopier copier;
        if (!mapCaches.containsKey(baseKey)) {
            copier = BeanCopier.create(source.getClass(), target, false);
            mapCaches.put(baseKey, copier);
        } else {
            copier = mapCaches.get(baseKey);
        }
        T instance = null;
        try {
            instance = target.getDeclaredConstructor().newInstance();
        } catch (Exception e) {
            log.error("mapper 创建对象异常" + e.getMessage());
        }
        copier.copy(source, instance, null);
        return instance;
    }

    private static String generateKey(Class<?> class1, Class<?> class2) {
        return class1.toString() + class2.toString();
    }

}

其中action的lambda表达式

@FunctionalInterface
public interface IAction<T> {
    void run(T param);
}

下面是各种框架copy的效率
在这里插入图片描述

A股历史数据免费下载终极指南:4000+个股数据一键打包获取 本文提供了获取A股历史数据的完整免费方案,重点介绍了Tushare Pro、AkShare等开源金融数据API的使用方法。通过详细的Python脚本示例,指导读者如何自动化批量抓取、清洗、存储4000多只个股的历史行情数据,并分享数据质量校验与性能优化技巧,助力量化研究与市场分析。 阅读详情

相关推荐

京瓷扫描驱动安装_京瓷喷头拆解和供墨原理剖析

在工业喷头打印领域,京瓷喷头作为主流喷头广泛应用于喷墨行业,目前京瓷喷头市面上销售主要有两个系列:KJ4A和KJ4B。其中KJ4A系列设计是用于油性墨水,例如UV墨水,主要用在广告领域;而KJ4B设计用于水性墨水,例如活性、分散墨水等,主要用在数码印花领域。最近我们团队对京瓷喷头进行了拆解分析,本期和大家分享一下我们对京瓷喷头拆解和喷头供墨原理的研究。京瓷喷头介绍1. KJ4A系列(油性)如下图所...

weixin_39883906的博客 1652

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

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

Vinjcent 7487

代谢组数据分析(二十二):代谢组原始数据Zscore标准化和主成分分析(PCA)及热图

本教程介绍了使用Z-score标准化和主成分分析(PCA)进行代谢组学数据预处理和分析的方法。代谢物原始数据具有高噪声、高维小样本、高变异性和复杂相互作用关系等特点,因此在数据分析时需注意数据质量控制、参数选择、批次效应、假阳性控制等问题。Z-score标准化通过将数据转换为均值为0、标准差为1的标准正态分布,提高了数据的可比性,减少了系统误差,并适应了统计分析方法的需求。PCA则通过降维、去相关和特征提取,帮助理解数据的结构和模式。教程还详细介绍了数据预处理步骤,包括填补缺失值、设置名称和顺序等,并提供了

专注生信领域 2797

SpringBoot对象拷贝

众所周知,java世界是由类构成的,各种各样的类,提供各种各样的作用,共同创造了一个个的java应用。对象是类的实例,在SpringBoot框架中,对象经常需要拷贝,例如数据库实体拷贝成业务实体,导入实体转换为业务实体,各种数据传输对象之间的拷贝等等。日常开发工作中用到的地方和频率是相当的高。本文就围绕对象拷贝来聊聊常用的姿势(方式)和工具。为了演示对象拷贝将创建几个实体类和几个生成测试数据的方法。

Reische的博客 1821

【Easy-mapper 】个灵活可扩展的高性能Bean mapping类库

1 背景 做Java开发都避免不了和各种Bean打交道,包括POJO、BO、VO、PO、DTO等,而Java的应用非常讲究分层的架构,因此就会存在对象在各个层次之间作为参数或者输出传递的过程,这里转换的工作往往非常繁琐。 这里举个例子,做过Java的都会深有体会,下面代码的set/get看起来不那么优雅  ElementConf ef = new ElementConf(); ef.

程序猿开发日志【学习永无止境】 2669

Spring BeanCopier与BeanUtils:属性传输的双剑合璧与各自锋芒

BeanCopier的设计理念在于追求极致的性能和效率,它通过动态代理和字节码生成技术,实现了高效的属性复制功能。而BeanUtils则更注重功能的丰富性和使用的便捷性,它提供了一整套完整的Bean操作工具,旨在简化JavaBean的处理过程。

m0_51176516的博客 712

jdk和cglib动态代理

的返回值类型必须是代理类的。增强或拦截方法的调用。

JAVA & HTML 575

Java PO BO DTO VO bean对象互相转换高性能实现工具

方案一:MapStruct Github 官网 MapStruct使用教程 方案二:Dozer Github 官网 Dozer使用教程 Dozer 工具类 import java.util.Collection; import java.util.List; import org.dozer.DozerBeanMapper; import com.google.common.collect.Lists; /** * 简单封装Dozer, 实现深度转换Bean<->Bean的Mapper.

zhaoyang10的专栏 4151

cglib、orika、spring等bean copy工具性能测试和原理分析

在实际项目中,考虑到不同的数据使用者,我们经常要处理 VO、DTO、Entity、DO 等对象转换,如果手动编写 setter/getter 方法一个个赋值,将非常繁琐且难维护。通常情况下,这类转换都是同名属性的转换(类型可以不同),我们更多地会使用 bean copy 工具,例如 Apache Commons BeanUtils、Cglib BeanCopier 等。 在使用 bean copy 工具时,我们更多地会考虑性能,有时也需要考虑深浅复制的问题。本文将对比几款常用的 bean copy 工具的

子月生的博客 1930

cglib动态生成class文件以及方法区溢出

cglib被hibernate用来动态生成po的字节码。CGLIB的底层是java字节码操作框架ASM。 今天简单看下cglib的用法。cglib的Enhancer说起来神奇,用起来一页纸不到就讲完了。它的原理就是用Enhancer生成一个原有类的子类,并且设置好callback到proxy, 则原有类的每个方法调用都会转为调用实现了MethodInterceptor接口的proxy的int

likaiwalkman@csdn - Code Study Area 1286

【业务功能篇71】CglibBeanCopier进行Bean对象拷贝

选择CglibBeanCopier进行Bean拷贝的理由是, 其性能要比Spring的BeanUtils,Apache的BeanUtils和PropertyUtils要好很多, 尤其是数据量比较大的情况下。 BeanCopier的主要作用是将数据库层面的Entity转化成service层的POJO。BeanCopier其实已经有很多开源版本,例如DozerMapper、Apache BeanUtils、Spring、Jodd BeanUtils甚至是Cglib都提供了这样的功能。我们这里讲的Bean

studyday1的博客 674

cglibBeanCopier高性能解密

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

布道 6275

基于原型模式和享元模式完成POJO属性拷贝

1 BeanCopier工具类代码: pom文件中引入依赖 <!-- cglibBeanCopier需要的依赖 --> <dependency> <groupId>asm</groupId> <artifactId>asm</artifactId> <version>3.3.1</version>

m0_37900506的博客 295

使用CGlib实现Bean拷贝(BeanCopier)

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

bingguang1993的博客 1838

Copier实现Bean的拷贝

选择CglibBeanCopier进行Bean拷贝的理由是,其性能要比Spring的BeanUtils,Apache的BeanUtils和PropertyUtils要好很多,尤其是数据量比较大的情况下。 1、简单例子,pom.xml <!-- cglibBeanCopier需要的依赖 --> <dependency> ...

tdt008的博客 589

Map,Bean对象互相转换

【代码】Map,Bean对象互相转换

web18484626332的博客 1257

Spring工具 BeanCopier异常问题

Spring工具 BeanCopier异常问题 我们经常遇到相同属性的不同类时,为了代码简洁性和可复用性,当然最重要的是节省时间,我们会用到复制这个功能,一般有普遍用的有spring、apache-commons、net.sf.cglib。当然如果时间允许可以基于反射实现此功能,下次带大家看下两种复制的性能比较。现在大多数项目用spring框架,所以本文主要来告诉大家使用spring的BeanCo...

qq_25113803的博客 4885

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

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

码工 827

java beanutils 性能_spring的BeanUtils和cglibBeanCopier性能比较

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

weixin_33565515的博客 830

springboot2.2.X手册:对象复制哪种最快?7种复制方式性能对比

目录 对象复制有哪些方式 引入最新包体 定义7个方法体 测试结果 以往我们做单体系统的时候,没有那么复杂的架构,出参,入参都非常简单,很多同学都会直接用map来进行组装,但是后面的系统越来越复杂,map的弊端出现了。 现在前后端分离,前端经常需要看后端有哪些接口,这就需要后端提供明确的出参及出参,这时候,就出现了非常多的对象,像VO,DTO,DO等。 对象有了,解决了领域对象的区分问题,但是也带来了两个问题 1、对象转化问题 2对象转化的性能问题 今天我们来聊聊,现有的对象复制,哪些性

互联网应用架构 2615

使用Spring的BeanCopier进行VO、PO、DTO对象转换

使用Spring的BeanCopier进行VO、PO、DTO对象转换 一、不封装工具类 实体类User、UserVO package com.example.demokafka.entity; import java.util.Date; import java.io.Serializable; import lombok.Data; /** * 用户表 (User)实体类 * * @author izhouy * @since 2021-06-29 13:04:15 */ @Data

weixin_43979189的博客 1803
上一篇: CentOS 7 通过yum命令安装 Mysql5.7
下一篇: SpringBoot2.0 Long型数据转换成json格式时丢失精度问题
VIM程序技术员
博客等级 码龄12年 32粉丝 31原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值