文章目录
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 是一个非常实用的工具方法,可以显著简化对象之间的属性复制工作,特别是在处理具有相似结构的实体类时。