在Java合作开发组织工作中,有许多这时候他们须要将完全相同的三个第一类示例展开特性拷贝,进而如前所述源第一类的特性重要信息展开先期操作方式,而不发生改变源第一类的特性重要信息。这三个第一类示例有可能将是同一类的三个示例,也可能将是完全相同类的三个示例,但她们的丫蕊中文名称完全相同。比如DO、DTO、VO、DAO等,那些虚拟的象征意义请查阅DDD中多层构架。责任编辑主要就如是说三种第一类复本的方式
1. 第一类复本
第一类复本分成深复本和浅复本。依照采用情景展开完全相同优先选择。在Java中,数据类别分成值类别(基本上数据类别)和提及类别,值类别主要包括int、double、byte、boolean、char等单纯数据类别,提及类别主要包括类、USB、字符串等繁杂类别。
广度复本和survive复本的主要就差别是与否全力支持提及类别的特性复本,责任编辑将深入细致探讨现阶段采用非常多的三种第一类复本的计划,和其与否全力支持深复本和操控性对照。
2. BeanUtils
2.1 apache的BeanUtils计划
采用
org.apache.commons.beanutils.BeanUtils展开第一类深入细致拷贝这时候,主要就透过向BeanUtils架构转化成捷伊类别放大器,即使预设情况下,BeanUtils对繁杂第一类的拷贝是提及,比如:能辨认出,采用
org.apache.commons.beanutils.BeanUtils拷贝提及时,主和源的提及为同一,即发生改变了主的提及特性会负面影响到源的提及,因此这是一类浅复本。须要注意的是,apache的BeanUtils中,以下类别如果为空,会报错(
org.apache.commons.beanutils.ConversionException: No value specified for *)当遇到这种问题是,能手动将类别放大器注册进去,比如data类别:
2.2 apache的PropertyUtils计划
PropertyUtils的copyProperties()方式几乎与BeanUtils.copyProperties()完全相同,主要就的差别是后者提供类别转换功能,即辨认出三个JavaBean的同名特性为完全相同类别时,在全力支持的数据类别范围内展开转换,PropertyUtils不全力支持这个功能,因此说BeanUtils采用更普遍一点,犯错的风险更低一点。而且它仍然属于浅复本。
Apache提供了 SerializationUtils.clone(T),T第一类须要实现 Serializable USB,他属于深克隆。
2.3 spring的BeanUtils计划
Spring中的BeanUtils,其中实现的方式很单纯,就是对三个第一类中完全相同名字的特性展开单纯get/set,仅检查属性的可访问性。
能看到, 成员变量赋值是如前所述目标第一类的成员列表, 并且会跳过ignore的和在源第一类中不存在的, 因此这个方式是安全的, 不会即使三个第一类之间的结构差异导致错误, 但必须保证同名的三个成员变量类别完全相同.
3. dozer
Dozer(
http://dozer.sourceforge.net/)能够实现深复本。Dozer是如前所述反射来实现第一类复本,反射调用set/get 或者是直接对成员变量赋值 。 该方式透过invoke执行赋值,实现时一般会采用beanutil, Javassist等开源库。单纯提及网上的例子,大多都是如前所述xml的配置,具体请查阅其它Blog:
4. MapStrcut
MapStrcut属于编译期的第一类拷贝计划,它能够动态生成set/get代码的class文件 ,在运行时直接调用该class文件。该方式实际上扔会存在set/get代码,只是不须要自己写了。
5. 自定义Pojoconvert
没有那么多验证,不是很安全但操控性不错。
6. BeanCopier
能透过缓存BeanCopier的示例来提高操控性。
7. fastjson和GSON
采用fastjson和GSON主要就是透过第一类json序列化和反序列化来完成第一类拷贝,这里只是提供一类不一样的第一类复本的思路,例子略。
8. 操控性
对两种BeanUtils、Gson和自定义Pojoconvert测试了操控性
结果就不贴出来了,在这里总结一下
Spring的BeanUtils比较稳定,不会即使量大了,耗时明显增加,但其实基准耗时比较长;apache的BeanUtils稳定性与效率都不行,不可取;Gson,即使做两个gson转换,因此正常项目中,可能将耗时会更少一些;PojoUtils稳定不如spring,但总耗时优势明显,原因是它只是依照项目的需求,实现的单纯的转换模板,这个代码在其它的几个工具类均有。
而在网上的其他Blog中(参见Reference),对Apache的BeanUtils、PropertyUtils和CGLIB的BeanCopier作了操控性测试。
测试结果:
操控性对照: BeanCopier > BeanUtils. 其中BeanCopier的操控性高出另外三个100数量级。
综上推荐采用:
BeanUtils(单纯,易用)BeanCopier(加入缓存后和手工set的操控性接近)Dozer(深拷贝)fastjson(特定情景下采用)