在现在的企业级Java应用程序中, Java Bean被广泛的应用。 一堆的相关的划分也应运而生, 如DTO, DAO, BO, POJO, VO等。这里不去管这些概念的细节, 如果你感兴趣,可以google之, 比如这篇文章。 这里要讨论的问题是如何在不同的Java Bean对象之间复制它们的属性?
这有几种情况需要考虑:
- 源对象和目标对象的类型可能不同
- 只想复制部分的对象
- 要复制的对象的属性名字不同
- 如何实现深复制 (deep copy)?
目前有几个Bean copy库可以使用:
Dozer
Dozer是一个功能强大的Bean复制库。 你可以通过Annotation, API或者XML定义Map规则。 XML是最简单,修改方便,非侵入的方式。
除了最简单不同类型,不同属性名称的转换外, Dozer还支持:
- 不同类型属性之间的转换,如字符串转为日期类型。 或者定制的类型转换
- 枚举类型
- 集合属性复制,并且支持Array,List,Set之间的转换
- Map类型的转换
- 索引属性
- 深拷贝
- 部分复制
- 单向复制
- 表达式
- ...
除此之外, 它还提供了Spring, JMX, JAXB的集成。
如果,实际上大部分,我们不需要这么强大的功能。 比如我们可能只是需要一个clone的功能。 你可以考虑使用 Apache common-beanutils和Spring BeanUtils类。
Apache common-beanutils
BeanUtils 类提供了两个转换方法:
|
|
第二个方法用来复制一个特定的属性。
属性名字必须一样, 类型不一样可能执行默认的数据转换。 执行浅复制。
它还提供了一个clone
方法。
|
|
Spring BeanUtils
Spring BeanUtils提供了更多的功能。
|
|
你可以指定要复制的属性 (第二种方法)或者排除部分属性(第三种方法)