BeanUtils.copyProperties笔记
阿里开发者手册:
【强制】避免用 Apache Beanutils 进行属性的 copy。
说明:Apache BeanUtils 性能较差,可以使用其他方案比如 Spring BeanUtils, Cglib BeanCopier,注意均是浅拷贝。
本笔记使用的是:
org.springframework.beans.BeanUtils#copyProperties
资料参考: BeanUtils.copyProperties的使用
场景
开发中经常遇到,把父类的属性拷贝到子类中。通常有2种方法:
1、一个一个set
2、用BeanUtils.copyProperties
很显然BeanUtils更加方便,也美观很多。
那么任何情况都能使用BeanUtils么,当然不是。要先了解他。
BeanUtils是深拷贝,还是浅拷贝?
是浅拷贝。
浅拷贝: 只是调用子对象的set方法,并没有将所有属性拷贝。(也就是说,引用的一个内存地址)
深拷贝: 将子对象的属性也拷贝过去。
什么情况适合用BeanUtils
如果都是单一的属性,那么不涉及到深拷贝的问题,适合用BeanUtils。
有子对象就一定不能用BeanUtils么
并不绝对,这个要区分考虑:
1、子对象还要改动。
2、子对象不怎么改动。
虽然有子对象,但是子对象并不怎么改动,那么用BeanUtils也是没问题的。
代码参考:
Teacher类
import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; @Data @Builder @AllArgsConstructor @NoArgsConstructor public class Teacher { Integer id; public String name; private Integer gender; }
Student类
import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; @Data @Builder @AllArgsConstructor @NoArgsConstructor public class Student { Integer id; public String name; protected Integer gender; private Teacher teacher; }
Test类
import org.junit.Test; import org.springframework.beans.BeanUtils; public class SpringBeanUtilsTest { @Test public void test01() { Teacher teacher01 = Teacher.builder().id(1).name("teacher1").gender(1).build(); Student student01 = Student.builder().id(1).name("laoda").gender(0).teacher(teacher01).build(); Student student02 = new Student(); BeanUtils.copyProperties(student01, student02); System.out.println(student01); System.out.println(student02); // Student(id=1, name=laoda, gender=0, teacher=Teacher(id=1, name=teacher1, gender=1)) // Student(id=1, name=laoda, gender=0, teacher=Teacher(id=1, name=teacher1, gender=1)) teacher01.setName("teacher2"); student01.setName("laoer"); System.out.println(student01); // 注意观察teacher:name的值,只修改了student01中teacher:name,但是student02也跟着变了(BeanUtils.copyProperties为浅拷贝, 有子对象慎用) System.out.println(student02); // Student(id=1, name=laoer, gender=0, teacher=Teacher(id=1, name=teacher2, gender=1)) // Student(id=1, name=laoda, gender=0, teacher=Teacher(id=1, name=teacher2, gender=1)) } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2017-06-09 简单的Spring Web工程跳转且传参Demo