Spring中的BeanUtils.copyProperties

简介: `BeanUtils.copyProperties()` 是 Spring 框架提供的工具方法,用于将一个 JavaBean 对象的属性值复制到另一个 JavaBean 对象中。主要功能包括属性拷贝、简化代码、类型转换等。该方法基于反射实现,支持属性名匹配和赋值,但仅执行浅拷贝,不支持深拷贝。使用时需注意属性名称和类型匹配,以及处理 null 值等问题。

BeanUtils.copyProperties() 是 Spring 框架中的一个工具方法,用于将一个 JavaBean 对象的属性值复制到另一个 JavaBean 对象中。其作用是将源对象的属性值复制到目标对象中,从而实现对象属性的拷贝。下面详细解释其作用和原理:

作用:

  1. 属性拷贝:将一个对象的属性值复制到另一个对象中,通常用于 DTO(数据传输对象)和领域模型对象之间的属性拷贝,以便在它们之间进行数据传输和转换。
  2. 简化代码:避免了手动逐个设置属性值的繁琐过程,提高了代码的简洁性和可读性。
  3. 类型转换:在属性值拷贝过程中,BeanUtils 可以自动进行类型转换,使得源对象和目标对象的属性类型不必完全一致。

原理:

  1. 反射:BeanUtils.copyProperties() 方法通过 Java 的反射机制来实现属性值的复制。它会获取源对象和目标对象的所有属性,并逐一进行复制。
  2. 属性名匹配:方法会通过反射机制获取源对象和目标对象的所有属性,并且会根据属性名进行匹配。只有在源对象和目标对象中具有相同名称且可访问的属性时,才会进行属性复制。
  3. 属性赋值:对于匹配的属性,会将源对象中的属性值直接赋值给目标对象的对应属性。这里的赋值操作是直接的引用赋值,不会进行类型转换或者复制属性值所引用的对象。
  4. 类型兼容性:如果源对象的属性类型与目标对象的属性类型不兼容,例如源对象的属性是基本类型,而目标对象的属性是包装类型,或者两者的属性类型不同,那么在赋值过程中会抛出类型转换异常。
  5. 属性过滤:可以通过设置参数来指定要复制的属性列表,从而实现部分属性的复制。

因此,在使用 BeanUtils.copyProperties() 方法时,需要注意确保源对象和目标对象的属性类型和名称都匹配,以避免类型转换异常或属性复制不完整的情况发生。对于类型不匹配的属性,需要提前进行类型转换或者采取其他适当的处理方式。

是浅拷贝还是深拷贝?

BeanUtils.copyProperties() 方法实现的是浅拷贝。

在浅拷贝中,只复制对象的引用,而不复制引用指向的对象。这意味着,如果源对象和目标对象的属性是对象类型(非基本数据类型),则它们在内存中引用的是同一个对象,而不是两个相互独立的对象。因此,如果修改了其中一个对象的属性,另一个对象的相应属性也会受到影响。

举例来说,假设源对象 source 和目标对象 target 都有一个属性 list,它们都引用同一个 ArrayList 对象。当使用 BeanUtils.copyProperties() 方法进行属性复制时,只会复制 list 属性的引用,而不会复制 ArrayList 对象本身。因此,如果修改了 source 对象的 list 属性,target 对象的 list 属性也会发生变化,因为它们引用的是同一个 ArrayList 对象。

如果需要进行深拷贝,即复制对象及其所有属性的副本,可以考虑使用其他工具或手动实现深拷贝逻辑,例如使用第三方库(如 Apache Commons BeanUtils 中的 BeanUtils.cloneBean() 方法)或手动递归复制对象的所有属性。

踩坑记录

1.属性名称和类型匹配问题

源对象和目标对象的属性名称要完全匹配,否则会导致部分属性无法复制或者属性值错误。另外,属性的类型也要保持一致,否则可能会发生类型转换异常。

2.深拷贝问题

BeanUtils.copyProperties() 方法进行的是浅拷贝,如果源对象的属性值是对象类型,并且被多个对象引用,那么目标对象的相应属性值也会引用同一个对象。这可能导致在修改一个对象的属性值时,其他对象的属性值也会受到影响。

java

代码解读

复制代码

//源对象
@Data  
public class SourceObject {  
private String name;  
private int age;  
private Map<String,String> map;  
}

//目标对象
@Data  
public class TargetObject {  
private String name;  
private int age;  
private Map<String,String> map;  
}

这时目标对象确实赋值了。但是如果改变map对象,目标对象也会跟着改变。

3.null 值处理

默认情况下,BeanUtils.copyProperties() 方法会将源对象中的所有非 null 属性值复制到目标对象中。如果希望忽略源对象中的 null 属性值,可以使用 BeanUtils.copyProperties() 方法的重载版本,并设置 ignoreNullSource 参数为 true

4.bean对应的属性,没有getter和setter方法

BeanUtils.copyProperties要拷贝属性值成功,需要对应的bean要有getter和setter方法。因为它是用反射拿到set和get方法再去拿属性值和设置属性值的。

5.属性是泛型,不会赋值

推荐使用hutool工具包的BeanUtil.copyProperties()

xml

代码解读

复制代码

<!--hutool-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.7.17</version>
        </dependency>

注意以下几点:

  1. 属性名和数据类型必须匹配
  • 在源对象和目标对象之间进行属性拷贝时,属性名和数据类型必须保持一致。如果属性名或数据类型不匹配,可能会导致拷贝失败或异常。
  • 只有在目标对象已经存在对应的属性时,才会进行属性值的复制。
  1. 自动属性映射
  • 如果源对象和目标对象的属性名不一致,但是数据类型匹配,BeanUtil.copyProperties() 方法会自动进行属性映射,将源对象的属性值复制到目标对象对应的属性中。
  • 1.属性名匹配: 如果源对象和目标对象的属性名完全一致,则直接进行属性值的复制。
  • 2.驼峰命名转换:如果源对象和目标对象的属性名不完全一致,但是符合驼峰命名规范(例如:sourceName 和 targetName),则会尝试进行驼峰命名的转换。例如,将 sourceName 转换为 source_name,然后与目标对象的属性进行匹配。
  • 3.忽略大小写:属性映射时会忽略属性名的大小写。即使源对象和目标对象的属性名在大小写上有差异,也会尝试进行匹配。
  1. 支持嵌套对象的属性复制
  • BeanUtil.copyProperties() 方法支持嵌套对象的属性复制,即如果源对象和目标对象的属性包含其他对象类型的属性,也会递归地进行属性复制。
  1. 支持集合属性的复制
  • Hutool 的 BeanUtil.copyProperties() 方法支持集合属性的复制,即如果源对象和目标对象的属性包含集合类型(如 List、Set、Map 等)的属性,也会进行正确的复制。
  1. 处理 null 值
  • 默认情况下,如果源对象的属性值为 null,BeanUtil.copyProperties() 方法不会将该属性复制到目标对象中,目标对象的属性值保持不变。这种行为可以避免将 null 值赋给目标对象的属性。
  1. 属性是泛型,不会赋值

转载来源:https://juejin.cn/post/7356772920277155890

相关文章
|
10天前
|
存储 人工智能 弹性计算
阿里云弹性计算_加速计算专场精华概览 | 2024云栖大会回顾
2024年9月19-21日,2024云栖大会在杭州云栖小镇举行,阿里云智能集团资深技术专家、异构计算产品技术负责人王超等多位产品、技术专家,共同带来了题为《AI Infra的前沿技术与应用实践》的专场session。本次专场重点介绍了阿里云AI Infra 产品架构与技术能力,及用户如何使用阿里云灵骏产品进行AI大模型开发、训练和应用。围绕当下大模型训练和推理的技术难点,专家们分享了如何在阿里云上实现稳定、高效、经济的大模型训练,并通过多个客户案例展示了云上大模型训练的显著优势。
|
14天前
|
存储 人工智能 调度
阿里云吴结生:高性能计算持续创新,响应数据+AI时代的多元化负载需求
在数字化转型的大潮中,每家公司都在积极探索如何利用数据驱动业务增长,而AI技术的快速发展更是加速了这一进程。
|
5天前
|
并行计算 前端开发 物联网
全网首发!真·从0到1!万字长文带你入门Qwen2.5-Coder——介绍、体验、本地部署及简单微调
2024年11月12日,阿里云通义大模型团队正式开源通义千问代码模型全系列,包括6款Qwen2.5-Coder模型,每个规模包含Base和Instruct两个版本。其中32B尺寸的旗舰代码模型在多项基准评测中取得开源最佳成绩,成为全球最强开源代码模型,多项关键能力超越GPT-4o。Qwen2.5-Coder具备强大、多样和实用等优点,通过持续训练,结合源代码、文本代码混合数据及合成数据,显著提升了代码生成、推理和修复等核心任务的性能。此外,该模型还支持多种编程语言,并在人类偏好对齐方面表现出色。本文为周周的奇妙编程原创,阿里云社区首发,未经同意不得转载。
|
10天前
|
人工智能 运维 双11
2024阿里云双十一云资源购买指南(纯客观,无广)
2024年双十一,阿里云推出多项重磅优惠,特别针对新迁入云的企业和初创公司提供丰厚补贴。其中,36元一年的轻量应用服务器、1.95元/小时的16核60GB A10卡以及1元购域名等产品尤为值得关注。这些产品不仅价格亲民,还提供了丰富的功能和服务,非常适合个人开发者、学生及中小企业快速上手和部署应用。
|
6天前
|
人工智能 自然语言处理 前端开发
用通义灵码,从 0 开始打造一个完整APP,无需编程经验就可以完成
通义灵码携手科技博主@玺哥超carry 打造全网第一个完整的、面向普通人的自然语言编程教程。完全使用 AI,再配合简单易懂的方法,只要你会打字,就能真正做出一个完整的应用。本教程完全免费,而且为大家准备了 100 个降噪蓝牙耳机,送给前 100 个完成的粉丝。获奖的方式非常简单,只要你跟着教程完成第一课的内容就能获得。
|
21天前
|
自然语言处理 数据可视化 前端开发
从数据提取到管理:合合信息的智能文档处理全方位解析【合合信息智能文档处理百宝箱】
合合信息的智能文档处理“百宝箱”涵盖文档解析、向量化模型、测评工具等,解决了复杂文档解析、大模型问答幻觉、文档解析效果评估、知识库搭建、多语言文档翻译等问题。通过可视化解析工具 TextIn ParseX、向量化模型 acge-embedding 和文档解析测评工具 markdown_tester,百宝箱提升了文档处理的效率和精确度,适用于多种文档格式和语言环境,助力企业实现高效的信息管理和业务支持。
3946 4
从数据提取到管理:合合信息的智能文档处理全方位解析【合合信息智能文档处理百宝箱】
|
10天前
|
算法 安全 网络安全
阿里云SSL证书双11精选,WoSign SSL国产证书优惠
2024阿里云11.11金秋云创季活动火热进行中,活动月期间(2024年11月01日至11月30日)通过折扣、叠加优惠券等多种方式,阿里云WoSign SSL证书实现优惠价格新低,DV SSL证书220元/年起,助力中小企业轻松实现HTTPS加密,保障数据传输安全。
532 3
阿里云SSL证书双11精选,WoSign SSL国产证书优惠
|
9天前
|
数据采集 人工智能 API
Qwen2.5-Coder深夜开源炸场,Prompt编程的时代来了!
通义千问团队开源「强大」、「多样」、「实用」的 Qwen2.5-Coder 全系列,致力于持续推动 Open Code LLMs 的发展。
|
17天前
|
安全 数据建模 网络安全
2024阿里云双11,WoSign SSL证书优惠券使用攻略
2024阿里云“11.11金秋云创季”活动主会场,阿里云用户通过完成个人或企业实名认证,可以领取不同额度的满减优惠券,叠加折扣优惠。用户购买WoSign SSL证书,如何叠加才能更加优惠呢?
995 3
|
14天前
|
机器学习/深度学习 存储 人工智能
白话文讲解大模型| Attention is all you need
本文档旨在详细阐述当前主流的大模型技术架构如Transformer架构。我们将从技术概述、架构介绍到具体模型实现等多个角度进行讲解。通过本文档,我们期望为读者提供一个全面的理解,帮助大家掌握大模型的工作原理,增强与客户沟通的技术基础。本文档适合对大模型感兴趣的人员阅读。
451 18
白话文讲解大模型| Attention is all you need