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))
    }
}
复制代码

 

posted @   码界小小学生  阅读(92)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2017-06-09 简单的Spring Web工程跳转且传参Demo
点击右上角即可分享
微信分享提示