当前位置: 首页 > 科技观察

放心大胆使用吧,BeanUtils.copyProperties并没有想象中的那么糟糕

时间:2023-03-19 21:23:29 科技观察

不知道从什么时候开始,大家都在批评Spring的BeanUtils.copyProperties,好像用这个方法复制bean的属性是劣质的,而且代码每分钟都是一堆代码和bug一样。但是相信这个方法在大家的项目中一定有很高的出镜率。今天我们就来分析一下BeanUtils.copyProperties经常被吐槽的点,是不是真的像大家说的那么糟糕。槽点1、如果不声明属性的get和set方法,会导致属性复制失败。首先我们要明白BeanUtils.copyProperties中sourceBean和targetBean的属性拷贝是通过反射中的Method完成的,所以如果Bean没有声明属性set和get方法,就不能在属性之间拷贝.所以不能说别人的框架有问题,就像我们不懂Springweb的原理,我们写的接口有问题,我们却说有问题Spring框架,岂不是犯罪?Slot2.copy是浅拷贝(对复制对象的引用)。BeanUtils.copyProperties的定位是快速浅拷贝。对于大多数场景来说,通过getset快速复制属性基本可以满足我们的日常需求。如果有深拷贝的需求,我们需要做的是更换拷贝工具,而不是抱怨BeanUtils.copyProperties有bug。槽点3.不同版本的Spring对属性泛型的处理方式不同@DatapublicclassSourceBean{privateListids;}@DatapublicclassTargetBean{privateListids;}从工具类的角度来看,这两个类具有相同的属性名称但不同的泛型类型,因此不会进行属性复制。这个问题从不同的角度来看似乎是合理的。从用户的角度来看,具有相同名称的属性不会复制值,这是一个错误。但是从工具类的角度来看,不同的泛型就相当于两个属性,不照抄也是合理的。但反过来说,如果工具类直接复制相同属性名的值,而没有验证泛型类型,那么当我们使用目标时,发现获取的值不是源中的类型,我们是否应该责怪工具类呢?是你自己决定的吗?所以我认为这个问题充其量是代码写的不规范造成的。性能对于大多数场景来说,属性复制不会对性能产生特别大的影响,一般不会成为性能瓶颈。综上所述,说了这么多,其实并不是要大家不假思索的使用BeanUtils.copyProperties,而是希望大家在合适的场景下,选择合适的工具,做合适的事情。我们常说只有透过现象看本质,真正理解背后的复制原理,才能不断提高自己的编码能力,而不是说某些工具不好用。借用一位老人的话:有的人工作5年就有5年的经验,有的人只用5年的经验。希望大家能像前者一样,在技术的道路上不断进步。