放心大胆的用,BeanUtils.copyProperties没有想象中的那么差

开发 前端
今天我们来分析一下,BeanUtils.copyProperties那些常被人吐槽的点,是否真的有大家说的那么不堪。

不知道从什么时候开始,大家对Spring的BeanUtils.copyProperties口诛笔伐,似乎用了这个方法拷贝bean属性就低人一等,代码分分钟就是一堆bug一样。但我相信,这个方法在大家的项目中出场率一定不低。

今天我们来分析一下,BeanUtils.copyProperties那些常被人吐槽的点,是否真的有大家说的那么不堪。

槽点1. 不声明属性的get、set方法,属性将copy失败

首先我们要明白,BeanUtils.copyProperties中sourceBean和targetBean的属性的拷贝,是通过反射中的Method完成的,所以如果Bean不声明属性的set和get方法,就不能进行属性间的copy。

所以说这不能说人家框架有问题,就像我们如果不了解Springweb的原理,写出的接口出了问题,却说Spring框架有问题,岂不是欲加之罪?

槽点2. copy为浅拷贝(拷贝对象的引用)

BeanUtils.copyProperties的定位就是快速浅拷贝,对于大多数的场景而言,通过getset方式快速复制属性,已经基本能满足我们的日常需求。如果有深拷贝的需求,那我们要做的应该更换拷贝工具,而不是埋怨BeanUtils.copyProperties有bug。

槽点3. Spring不同版本对属性泛型处理方式不同

@Data
public class SourceBean {
private List<Integer> ids;
}

@Data
public class TargetBean {
private List<String> ids;
}

从工具类的角度看,两个类的属性名相同,但是泛型类型不同,所以未进行属性复制。

这个问题从不同的角度看似乎都有其合理性。从用户角度看,同一个名称的属性未复制值,这是个bug。但是从工具类角度看,不同的泛型就相当于两个属性,不复制是合理的。

但是反过来想,如果工具类直接把属性名相同的值进行复制,而不校验泛型,那么当我们使用target的时候,发现获取的值不是source中的类型,是不是又该埋怨工具类擅自做主了呢?

所以我觉得,这个问题顶多算是写代码不规范导致的。

性能

对于绝大部分场景来说,属性复制不会对性能有特别大的影响,一般不会成为性能瓶颈。

总结

说了这么多,其实也并不是要大家无脑的去使用BeanUtils.copyProperties,而是希望大家在合适的场景选用合适的工具做合适的事。

我们常说,透过现象看本质,能真正的理解其背后的复制原理,才能让我们的编码能力不断提升,而不是人云亦云的说某某工具类不好用。

借用一位老哥的话:有的人干5年有5年的经验,有的人一个经验用5年。希望大家都能像前者一样,在技术的道路不断进步。

责任编辑:姜华 来源: 今日头条
相关推荐

2023-05-29 08:56:34

深拷贝浅拷贝对象

2024-06-04 00:10:00

开发拷贝

2024-02-27 10:42:04

开发代码测试

2016-06-08 13:42:08

2010-08-20 09:37:04

虚拟化

2014-03-31 15:32:36

AndroidNDK开发

2022-12-09 07:53:20

vo2dto方法AOP

2023-12-04 07:18:05

Goswitch

2014-01-12 10:47:39

移动广告观察

2023-07-30 16:09:38

数字经济数字化转型

2020-09-30 10:40:56

人工智能AI

2013-01-06 13:45:14

2015-08-06 15:24:21

2011-03-21 16:10:08

SQL Server日志

2018-07-30 09:00:49

技术管理实践

2012-10-17 10:08:03

2017-03-13 13:17:53

互联网

2010-01-18 10:27:20

2015-06-24 10:32:13

讯鸟云计算会展

2017-08-09 14:49:03

WebHTTPS浏览器
点赞
收藏

51CTO技术栈公众号