BeanUtils.copyProperties作用

本文介绍了如何在Java中使用BeanUtils库实现两个实体类(如Student和Person)之间的属性复制,包括新建实体类、添加依赖、编写main方法测试以及观察结果。结论是当两个实体类具有相同的属性名称和类型时,BeanUtils.copyProperties方法可以成功进行对象拷贝。
摘要由CSDN通过智能技术生成

BeanUtils.copyProperties 是 Spring 框架提供的一个工具方法,用于在两个 JavaBean 之间复制属性值。这个方法非常方便,可以大大减少手动复制属性的工作量,尤其是在处理具有相似字段结构的实体类时。

一、作用

BeanUtils.copyProperties 的主要作用是在两个对象之间复制属性值,前提是这两个对象具有相同的属性名。这种方法特别适用于以下场景:

1.实体类之间的转换

例如,在 RESTful API 中,通常需要将数据库实体(如 User)转换为 DTO(Data Transfer Object)或 VO(Value Object),以便在网络上传输。使用 BeanUtils.copyProperties 可以简化这个过程。

2.模型层与视图层之间的数据转换

在 MVC 架构中,模型层的对象(如 Model)和视图层的对象(如 ViewModel)之间需要进行数据转换。

3.简化代码

避免手动编写每个属性的赋值操作,提高代码的可读性和可维护性。

二、举例

(1)新建两个实体类

package org.example;

import java.util.Date;

public class Student {


    private String name;
    private String age;
    private String tel;
    private Boolean isno;
    private Date time;

    public Student() {
    }

    public Student(String name, String age, String tel, Boolean isno, Date time) {
        this.name = name;
        this.age = age;
        this.tel = tel;
        this.isno = isno;
        this.time = time;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getTel() {
        return tel;
    }

    public void setTel(String tel) {
        this.tel = tel;
    }

    public Boolean getIsno() {
        return isno;
    }

    public void setIsno(Boolean isno) {
        this.isno = isno;
    }

    public Date getTime() {
        return time;
    }

    public void setTime(Date time) {
        this.time = time;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", tel='" + tel + '\'' +
                ", isno=" + isno +
                ", time=" + time +
                '}';
    }
}

package org.example;

import java.util.Date;
import java.util.Objects;

public class Person {

    private String name;
    private int age;
    private String phone;
    private Boolean isno;
    private Date time;


    public Person() {
    }


    public Person(String name, int age, String phone, Boolean isno, Date time) {
        this.name = name;
        this.age = age;
        this.phone = phone;
        this.isno = isno;
        this.time = time;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public Boolean getIsno() {
        return isno;
    }

    public void setIsno(Boolean isno) {
        this.isno = isno;
    }

    public Date getTime() {
        return time;
    }

    public void setTime(Date time) {
        this.time = time;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return Objects.equals(name, person.name) && Objects.equals(age, person.age) && Objects.equals(phone, person.phone);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age, phone);
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", phone='" + phone + '\'' +
                ", isno=" + isno +
                ", time=" + time +
                '}';
    }
}

(2)pom引入依赖

因为BeanUtils依赖于spring-beans的依赖包

<!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.1.5.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>1.7.22</version>
        </dependency>

(3)main方法测试

    public static void main(String[] args) {
        Student student = new Student("zhangsan", "23", "2324234",true,new Date());
        Person person = new Person("LISI", 12, "876543",false,new Date(2017,9,9));
        BeanUtils.copyProperties(student, person);
        System.out.println(student);
        System.out.println(person);
    }

(4)结果输出

Student{name='zhangsan', age=23, tel='2324234', isno=true, time=Mon May 06 17:49:42 CST 2024}
Person{name='zhangsan', age=23, phone='876543', isno=true, time=Mon May 06 17:49:42 CST 2024}

(5)结论

只要两个实体的属性名称和类型都相同,就可以做到拷贝
BeanUtils.copyProperties(A,B);
把A拷贝到B

三、注意事项

1.属性类型匹配

BeanUtils.copyProperties 会自动处理属性类型的匹配。如果两个对象的属性类型不匹配,则需要显式转换。

2.忽略某些属性

如果你不想复制某些属性,可以使用 BeanUtils.copyProperties 的重载方法,传入一个 Converter 或 ConverterRegistry 来处理类型转换,或者使用 ConversionService。
属性名大小写敏感:BeanUtils.copyProperties 默认是大小写敏感的,即 name 和 Name 会被视为不同的属性。

3.属性的可访问性

属性必须具有公共的 getter 和 setter 方法才能被 BeanUtils.copyProperties 正确复制。

4.性能考虑

虽然 BeanUtils.copyProperties 很方便,但在性能敏感的应用中,手动赋值可能更高效。此外,过度使用 BeanUtils.copyProperties 可能会导致难以追踪的问题,特别是在复杂的属性结构中。

四、扩展使用

如果你想忽略某些属性或进行更复杂的属性映射,可以使用 Spring 的 ModelMapper 库,它提供了更多的配置选项和映射功能。

总之,BeanUtils.copyProperties 是一个非常实用的工具方法,可以显著简化对象之间的属性复制工作,特别是在处理具有相似结构的实体类时。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值