Copiers 是一个优雅的 Bean 拷贝工具,可通过友好的 Fluent API 帮助用户完成拷贝对象的操作。
依赖
1 | <!-- java7 --> |
底层实现
Copiers 目前有两种实现:Cglib
& Orika
,用户可以通过工厂方法来切换底层的拷贝方式。
1 | // orika |
Cglib
Cglib 中的 BeanCopier 是目前性能最好的拷贝方式,基于 ASM 字节码增强技术,千万次拷贝仅需毫秒即可完成,但高性能带来的显著缺点是功能单一、拓展性差,BeanCopier 仅支持源对象到目标对象的完全拷贝,不支持自定义映射,Convert 拓展也只能对拷贝的 value 做处理,很多情况下不满足实际的业务需求。
注意:
- BeanCopier 只拷贝名称和类型都相同的属性
- 当目标类的 setter 方法少于 getter 方法时,会导致创建 BeanCopier 失败
- 一旦使用 Converter,BeanCopier 将完全使用 Converter 中定义的规则去拷贝,所以在
convert()
方法中要考虑到所有的属性,否则会抛出ClassCastException
Orika
Orika 基于 Javassist 字节码技术,千万次拷贝在 5s 左右。性能虽不如 Cglib,但 Orika 的优点在于灵活性、扩展性强,详细介绍可以查看 Orika 的 Github:https://github.com/orika-mapper/orika,另外强烈推荐这篇使用教程:http://www.baeldung.com/orika-mapping
注意:
- 拷贝结果为浅拷贝
- 支持级联拷贝,但是需要提前注册好级联对象之间的映射关系,且可以使用
parent()
方法来指定父类- 支持源对象中的集合类型直接拷贝到目标对象的集合
- 不同类型有默认的 Converter 做转换
使用方式
通过工厂方法建立 sourceClass 与 targetClass 之间的关系后,调用 copy()
方法即可完成 Bean 拷贝,调用 map()
方法即可完成 List 拷贝,简洁高效。
Cglib
1 | // 建立 User.class 与 UserEntity.class 之间的映射关系 |
Orika
1 | // 建立 User.class 与 UserEntity.class 之间的映射关系 |
Orika 进阶
Orika 支持强大的自定义关系映射,并且使用缓存技术,一次注册后续直接使用。
1 | // 跳过拷贝的属性,支持配置多个 |
当然,以上映射关系可以任意搭配使用,同样只需一次注册。
1 | // 创建 copier |
如果你在使用 Java8 那就更好了,利用 Copiers 可以更容易的完成拷贝操作。
1 | // 创建 copier |
Change Log
TODO
任何意见和建议可以提 ISSUE,我会酌情加到 TODO List,一般情况一周内迭代完毕。
About Me
QQ:349096849
Email:donghao.l@hotmail.com
Blog:Trang’s Blog