使用Cglib的BeanCopier实现Bean的拷贝

Spring学习笔记(二)【CGLIB拷贝BeanCopier使用和详解】 常用的bean拷贝工具类当中,主要有Apache提供的beanUtils、Spring提供的beanUtils、Cglib提供的beanCopier,性能上分析如下表所示 阅读详情


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

伦理片 http://www.dotdy.com/

       下面看具体例子:

Java代码   收藏代码
  1. package com.yusj.utils;  
  2.   
  3. import java.util.HashMap;  
  4. import java.util.Map;  
  5.   
  6. import net.sf.cglib.beans.BeanCopier;  
  7.   
  8. /** 
  9.  *  
  10.  * 将beancopier做成静态类,方便拷贝 
  11.  * <br>创建日期:2015年12月1日 
  12.  * <br><b>Copyright 2015 UTOUU All Rights Reserved</b> 
  13.  * @author yushaojian 
  14.  * @since 1.0 
  15.  * @version 1.0 
  16.  */  
  17. public class CglibBeanCopierUtils {  
  18.       
  19.     /** 
  20.      *  
  21.      */  
  22.     public static Map<String, BeanCopier> beanCopierMap = new HashMap<String, BeanCopier>();  
  23.       
  24.     /**  
  25.     * @Title: copyProperties  
  26.     * @Description: TODO(bean属性转换)  
  27.     * @param source 资源类 
  28.     * @param target  目标类  
  29.     * @author yushaojian 
  30.     * @date 2015年11月25日下午4:56:44 
  31.     */  
  32.     public static void copyProperties(Object source,Object target){  
  33.         String beanKey = generateKey(source.getClass(),target.getClass());  
  34.         BeanCopier copier = null;  
  35.         if (!beanCopierMap.containsKey(beanKey)) {  
  36.             copier = BeanCopier.create(source.getClass(), target.getClass(), false);  
  37.             beanCopierMap.put(beanKey, copier);  
  38.         }else {  
  39.             copier = beanCopierMap.get(beanKey);  
  40.         }  
  41.         copier.copy(source, target, null);  
  42.     }  
  43.     private static String generateKey(Class<?>class1,Class<?>class2){  
  44.         return class1.toString() + class2.toString();  
  45.     }  
  46.     /*注: 
  47.     (1)相同属性名,且类型不匹配时候的处理,ok,但是未满足的属性不拷贝; 
  48.     (2)get和set方法不匹配的处理,创建拷贝的时候报错,无法拷贝任何属性(当且仅当sourceClass的get方法超过set方法时出现) 
  49.     (3)BeanCopier  
  50.     初始化例子:BeanCopier copier = BeanCopier.create(Source.class, Target.class, useConverter=true) 
  51.     第三个参数userConverter,是否开启Convert,默认BeanCopier只会做同名,同类型属性的copier,否则就会报错. 
  52.     copier = BeanCopier.create(source.getClass(), target.getClass(), false); 
  53.     copier.copy(source, target, null); 
  54.     (4)修复beanCopier对set方法强限制的约束 
  55.     改写net.sf.cglib.beans.BeanCopier.Generator.generateClass(ClassVisitor)方法 
  56.     将133行的 
  57.     MethodInfo write = ReflectUtils.getMethodInfo(setter.getWriteMethod()); 
  58.     预先存一个names2放入 
  59.      109        Map names2 = new HashMap(); 
  60.      110        for (int i = 0; i < getters.length; ++i) { 
  61.      111          names2.put(setters[i].getName(), getters[i]); 
  62.                 } 
  63.     调用这行代码前判断查询下,如果没有改writeMethod则忽略掉该字段的操作,这样就可以避免异常的发生。*/  
  64.   
  65. }  

 影音先锋电影 http://www.iskdy.com/

maven依赖如下4个包:

Xml代码   收藏代码
  1. <dependency>  
  2.             <groupId>asm</groupId>  
  3.             <artifactId>asm</artifactId>  
  4.             <version>3.3.1</version>  
  5.         </dependency>  
  6.         <dependency>  
  7.             <groupId>asm</groupId>  
  8.             <artifactId>asm-commons</artifactId>  
  9.             <version>3.3.1</version>  
  10.         </dependency>  
  11.         <dependency>  
  12.             <groupId>asm</groupId>  
  13.             <artifactId>asm-util</artifactId>  
  14.             <version>3.3.1</version>  
  15.         </dependency>  
  16.         <dependency>  
  17.             <groupId>cglib</groupId>  
  18.             <artifactId>cglib-nodep</artifactId>  
  19.             <version>2.2.2</version>  
  20.         </dependency>  

 

Java对象转换最佳方案 UserDO@Data}复制代码UserDTO@Data}复制代码软件系统一般都会进行分层,领域模型也会随之进行分层,即每层都有自己关注的模型对象;分层的主要原因是便于维护。模型之间的对象经常要互相转换,常用的转换实现有反射和get/set,反射的性能很差不建议使用然后写了基于get/set实现beancopier和mapstruct使用方式,简单测试了下性能,mapstrcut优于其它各种对象转换方式。 阅读详情

相关推荐

java Bean拷贝忽略空属性

java bean拷贝一般采用两种办法 1.Spring里面的方法, org.springframework.beans.BeanUtils.copyProperties 2.Apache里面的方法,org.apache.commons.beanutils.BeanUtils.copyProperties 但是有需要注意的地方,Spring中BeanUtils.copyProperties(A...

weixin_43836438的博客 2619

使用CGlib实现Bean拷贝(BeanCopier)

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

bingguang1993的博客 1838

【C语言作业4】copy字符串,忽略空格

从键盘输入字符串,忽略空格后输出 ...

qq_44314658的博客 1304

使用CGlib实现Bean拷贝BeanCopier

https://blog.csdn.net/zmx729618/article/details/78363191 二、自定义转换器 当源和目标类的属性类型不同时,不能拷贝该属性,此时我们可以通过实现Converter接口来自定义转换器 源类和目标类: Java代码 public class AccountEntity { private int id; private Timestamp cre...

大叶子不小的博客 839

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

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

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

cglib BeanCopier使用

一、概述   选择CglibBeanCopier进行Bean拷贝的理由是,其性能要比Spring的BeanUtils,Apache的BeanUtils和PropertyUtils要好很多,尤其是数据量比较大的情况下。   之前的一篇文章:Easy-mapper教程——模型转换工具提到了CglibBeanCopier使用ASM字节码生成技术,所以性能会非常好。   下面的文章内容直接整理...

weixin_33985679的博客 1489

BeanCopier使用

【代码】BeanCopier使用

weixin_43860634的博客 3992

Copier实现Bean拷贝

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

tdt008的博客 589

CGLIB BeanCopierBeanMap等实现

BeanCopier,BulkBean,Enancher等内容,以前虽大致知道一些内容,原理是通过bytecode,但没具体深入代码研究,只知其所用不知其所以然,所以就特地花了半天多的工作时间研究了CGLIB的相关源码,同时结合看了下 spring Aop中对CGLIB使用。 本文主要通过对cglib有原理的分析,反编译查看源码,例子等方式做一...

weixin_33924770的博客 938

copy bean的工具类

public class CopyUtils { /** * 完成bean之间的拷贝 * @param source 源对象 * @param dest 目标对象 */ public static void copy(Object source, Object dest){ if (source != null) { BeanCopier copier = Bean...

yyyyyysssssshhhhhh的博客 740

jsp和controller数据交互工具类

1 2 import java.util.ArrayList; import java.util.List; import java.util.concurrent.ConcurrentHashMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cglib

lisheng19870305的专栏 1385

Java基础外站相关博客链接

Java8特性① Lambda 表达式 https://www.jianshu.com/p/4b6a875694f0

u012755196的博客 154

使用 cgLib BeanCopier 高性能 拷贝Java 对象 包括List 集合 工具

使用 BeanCopier 拷贝Java 对象 包括List 集合 package net.tt.xuanliu; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; /** * @ClassName BeanUtils * @Description bean 工具 * @Author

qq_40124831的博客 2775
上一篇: 移动广告平台如何变得更具有价值?
下一篇: day_31Java注解---Annotation
dotedy
博客等级 码龄11年 61粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值