BeanUtils.copyProperties(org.springframework.beans.BeanUtils) 和 BeanUtil.copyProperties( Hutool)

一、BeanUtils.copyProperties(source,target);

1、使用

将source的属性复制给target,但是这里只针对target中和source相同的字段或属性。
如source类为A中有字段:id、name、age;
target类为B中有字段:id、name
A a=new A();
B b=new B();
a.setId(1);
a.setName(“Arya”);
a.setAge(11);
BeanUtils.copyProperties(a,b);
结果b的id为1、name为Arya

2、使用情景(Spring 框架下的org.springframework.beans.BeanUtils)

BeanUtils它提供了对java反射和自省API的包装。它里面还有很多工具类,一般当我们有两个具有很多相同属性的JavaBean实体类时,传统的方式对属性逐个赋值:依次的进行set,get但是这样的赋值方式,是非常麻烦的,而且重复代码量可以会很多,很冗余。而这时我们就可以使用BeanUtils.copyProperties()方法
并且用起来很方便,一行代码就可以搞定,简单明了:

//source:源; 目标:target
BeanUtils.copyProperties(Object source, Object target); 
=> BeanUtils.copyProperties("转换前的类", "转换后的类");

Spring的BeanUtils的CopyProperties方法需要对应的属性有getter和setter方法;如果存在属性完全相同的内部类,但是不是同一个内部类,即分别属于各自的内部类,则spring会认为属性不同,不会copy;spring和apache的copy属性的方法源和目的参数的位置正好相反,所以导包和调用的时候都要注意一下。

二、BeanUtils.copyProperties(org.springframework.beans.BeanUtils) 和 BeanUtil.copyProperties( Hutool提供) 区别

1)使用BeanUtils 实现属性拷贝,在类型不同时,会忽略 target 对象相同命名的参数(即字段名称一致但字段类型不同),而 Hutool 提供的BeanUtil则不会忽略。

BeanUtils.copyProperties 无法转换数据类型不同的数据,因类型不一致,所以数据复制失败。
这是因为:spring在利用反射复制对象时,是以javaBean的规范来使用get/set方法进行设置值的。
同时set方法的参与类型,在classLoader中,也会被计为函数名的一部分。
(使用BeanUtils.copyProperties时,底层使用了大量的反射机制,导致类加载器和类的元信息过多,最终可能会导致OOM)

所有这里必须都是同类型,否则spring就不会对该属性进行复制相应的值。

【解决1 : 使用fastJson】

导入依赖
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.78</version>
</dependency>

b = JSONObject.parseObject(JSONObject.toJSONString(a),B.class);

2)BeanUtil.copyProperties虽然字段类型不一样,但是做了兼容处理,所以业务没有影响业务逻辑。

三、 浅拷贝的现象就是对象指向同一个内存地址,修改了拷贝前的对象的值就会影响拷贝后的值,这两个只能算是简单的属性复制并不能算浅拷贝或深拷贝。

### 来源库 BeanUtil.copyProperties 函数来源于 Hutool 库[^2],而 BeanUtils.copyProperties 是 Spring 框架中的工具函数[^1]。 ### 功能实现 #### 缓存机制 Hutool 的 `BeanUtil.copyProperties` 方法实现了缓存优化来减少反射带来的性能开销。这种缓存可以显著提高多次执行时的效率。 对于 `org.springframework.beans.BeanUtils.copyProperties` 而言,并未提及类似的全局缓存策略。每次调用都会重新解析目标类结构并查找 getter/setter 方法,这可能导致频繁使用时性能不如前者。 #### 类型转换处理 当遇到类型不同的字段时: - **Spring** 版本会在检测到类型不匹配的情况下跳过这些字段而不抛出异常[^4]; - **Hutool** 则尝试自动进行基本的数据类型转换,使得即使源目的地之间存在轻微类型的差异也能顺利完成复制操作。 ```java // 示例代码展示两种方式下不同类型字段的行为差异 public class Source { public Integer id; } public class Target { public Long id; // 不同但兼容的基础数据类型 } ``` ### 使用场景 由于上述特性上的差别,在选择具体哪个版本之前应当考虑实际需求: - 如果项目已经引入了 Spring Boot 或者其他基于 Spring 的框架,那么直接利用内置的 `BeanUtils.copyProperties` 更加方便快捷[^3]。 - 当应用程序对性能敏感并且需要支持更加灵活的对象映射逻辑(比如跨模块间传递 DTO),此时选用带有更多特性的第三方库如 Hutool 可能更为合适。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值