SpringBoot 对象属性拷贝 BeanUtils.copyProperties

发布于 2024-10-18 10:23:04 字数 2633 浏览 6 评论 0

平常我们在开发过程中经常会遇到将某个对象的一些属性赋值给另一个对象,常见的是将前端传输的 from 或者 DTO 赋值给 DO

DO/DTO/VO/FORM 的区别

  • DO 就是 entity ,对应表实体,和数据库的字段一一对应
  • DTO 数据传输对象,DTO 本身不是业务对象
  • VO 用于封装传递到前端需要展示的字段,数据库表不需要展示的,不要包含
  • form 用于封装前端传入的字段, 可以配合 @Valid 注解,对前端传入数据,进行验证,比如必填字段

使用

一般我们会这么写:

public class UserInputDTO {

@NotNull
private String username;

@NotNull
private Integer age;

private Boolean sex;

@NotNull
private String desc;

private LocalDate birthday;
}

public class User {
private String userId;

private String username;

private String password;

private Integer age;

private Boolean sex;

private String desc;

private LocalDate birthday;
}

//使用
UserInputDTO userInputDTO = new UserInputDTO();
userInputDTO.setUsername("username");
userInputDTO.setAge(20);
userInputDTO.setBirthday(LocalDate.of(2000, 1, 1));
userInputDTO.setSex(Boolean.TRUE);
userInputDTO.setDesc("this is my desc");

User user = new User();
user.setUsername(userInputDTO.getUsername());
user.setAge(userInputDTO.getAge());
user.setBirthday(userInputDTO.getBirthday());
user.setSex(userInputDTO.getSex());
user.setDesc(userInputDTO.getDesc());

而实际上,Spring 框架自带一个工具类,可以实现上面的功能,避免编写重复的样板代码:

UserInputDTO userInputDTO = new UserInputDTO();
userInputDTO.setUsername("username");
userInputDTO.setAge(20);
userInputDTO.setBirthday(LocalDate.of(2000, 1, 1));
userInputDTO.setSex(Boolean.TRUE);
userInputDTO.setDesc("this is my desc");

User user = new User();
BeanUtils.copyProperties(userInputDTO, user);

BeanUtils 提供对 Java 反射和自省 API 的包装。其主要目的是利用反射机制对 JavaBean 的属性进行处理

注意要求

当然如果使用了该工具类,有些情况需要开发过程中注意下:

  • 对象属性,最好为包装类,否则可能出现 null 与 0 的问题
  • 这个工具类是对 bean 之间存在属性名相同的属性进行处理,无论是源 bean 或者是目标 bean 中多出来的属性均不处理
  • BeanUtils 是浅拷贝,需注意深浅拷贝的不同

深浅拷贝

  • 浅拷贝: 只是调用子对象的 set 方法,并没有将所有属性拷贝。(也就是说,引用的一个内存地址)
  • 深拷贝: 将子对象的属性也拷贝过去

同类的还有 Apache 的 commons 库里也有 BeanUtils,需注意如果使用了 Apache 的工具类的话,参数与 Spring 提供的参数顺序是相反的,当然《阿里巴巴 java 开发手册》中明确规定

从网上搜索相关资料,可以知晓,大概是效率问题,是因为 Apache BeanUtils 在代码中增加了非常多的校验、兼容、日志打印等代码,导致性能下降严重(当然在一些特定场景中这些校验还是比较重要的)。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

野心澎湃

暂无简介

0 文章
0 评论
620 人气
更多

推荐作者

玍銹的英雄夢

文章 0 评论 0

我不会写诗

文章 0 评论 0

十六岁半

文章 0 评论 0

浸婚纱

文章 0 评论 0

qq_kJ6XkX

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文