朵小喵儿|七种对象复制工具类,你最看好哪个?( 三 )
所以两者选择 , 还是推荐使用 Spring BeanUtils 。
Cglib BeanCopier上面两个是阿粉日常工作经常使用 , 而下面的这些都是阿粉最近才开始接触的 , 比如 Cglib BeanCopier 。 这个使用方法 , 可能比上面两个类稍微复杂一点 , 下面我们来看下具体用法:
首先我们引入 Cglib 依赖:
画外音:如果你工程内还有 Spring-Core 的话 , 如果查找 BeanCopier 这个类 , 可以发现两个不同的包的同名类 。
一个属于 Cglib , 另一个属于 Spring-Core 。
其实 Spring-Core 内BeanCopier 实际就是引入了 Cglib 中的类 , 这么做的目的是为了了保证 Spring 使用长度 Cglib 相关类的稳定性 , 防止外部 Cglib 依赖不一致 , 导致 Spring 运行异常 。
转换代码如下:
// 省略赋值语句StudentDO studentDO = new StudentDO();BeanCopier beanCopier = BeanCopier.create(StudentDTO.class, StudentDO.class, false);beanCopier.copy(studentDTO, studentDO, null);使用方法相比 BeanUtils ,BeanCopier 稍微多了一步 。对比studentDO与 studentDTO对象:
从上面可以得到与 Spring Beanutils 基本一致的结论:
- 字段名不一致 , 属性无法复制
- 类型不一致 , 属性无法复制 。 不过有点不一样 , 如果类型为基本类型/基本类型的包装类型 , 这两者无法被拷贝 。
- 嵌套对象字段 , 将会与源对象使用同一对象 , 即使用浅拷贝
不过在 BeanCopier 下 , 我们可以引入转换器 , 进行类型转换 。
// 注意最后一个属性设置为 trueBeanCopier beanCopier = BeanCopier.create(StudentDTO.class, StudentDO.class, true);// 自定义转换器beanCopier.copy(studentDTO, studentDO, new Converter() {@Overridepublic Object convert(Object source, Class target, Object context) {if (source instanceof Integer) {Integer num = (Integer) source;return num.toString();}return null;}});不过吐槽一下这个转换器 , 一旦我们自己打开使用转换器 , 所有属性复制都需要我们自己来了 。 比如上面的例子中 , 我们只处理当源对象字段类型为 Integer , 这种情况 , 其它都没处理 。 我们得到 DO 对象将会只有 name 属性才能被复制 。DozerDozer, 中文直译为挖土机, 这是一个「重量级」属性复制工具类 , 相比于上面介绍三个工具类 , Dozer 具有很多强大的功能 。
画外音:重量级/轻量级其实只是一个相对的说法 , 由于 Dozer 相对 BeanUtils 这类工具类来说 , 拥有许多高级功能 , 所以相对来说这是一个重量级工具类 。
推荐阅读
- 朵小喵儿|2021年迎来考验,美国企业或将再次入局,国产手机
- 朵小喵儿|国产手机,2021年迎来考验,美国企业或将再次入局
- 朵小喵儿|突破旗舰封锁,魅族今年性能旗舰亮新玩法,销量真稳了
- 朵小喵儿|小天才手表背后,是成人世界的焦虑
- 朵小喵儿|主板维修必备!海量主板电路图+CPU程序下载
- 朵小喵儿|如何成为制造大国?曹德旺一语中的:先把“这个”取消再说
- 朵小喵儿|蔚来总部临时办公大楼预计下月启用 位于合肥经开区
- 朵小喵儿|腾讯AI Lab高级研究员宋林峰:图到文本生成任务中的通用型图结构信息保存法
- 朵小喵儿|突发!特朗普政府考虑将国内最大芯片制造商中芯国际列入贸易黑名单
- 朵小喵儿|硬件捡垃圾33期
