首页 > 其他分享 >BeanUtils.copyProperties笔记

BeanUtils.copyProperties笔记

时间:2023-06-09 16:25:52浏览次数:43  
标签:name gender 笔记 copyProperties Student import BeanUtils id

阿里开发者手册:

【强制】避免用 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))
    }
}

 

标签:name,gender,笔记,copyProperties,Student,import,BeanUtils,id
From: https://www.cnblogs.com/dzpykj/p/17469506.html

相关文章

  • 「学习笔记」DP 学习笔记1
    序列DP一般序列DP核心思想:将序列的前\(i\)个数的状态用一个更简单的形式表示出,并且体现出这些状态对后续的影响。题目ABC267D给定一个序列\(a\),找到一个长度为\(m\)的子序列\(b\),使得\(\sumb_i×i\)最大。\(n,m\le2×10^3\)。状态:\(f(i,j)\):前\(i......
  • 011 数据库学习笔记--游标
    游标:定义:游标是对数据查询结果集的一种访问机制,允许用户对结果集进行逐条访问,即单条数据。访问对象是,结果集可以理解为定义在特定结果集上的指针,控制这个指针,遍历数据集或制定特定的行--对其进行读取或写入作用:定位到结果集中的某一行,对当期位置的数据进行读写数据读取......
  • K-means(K均值聚类算法)算法笔记
    K-means(K均值聚类算法)算法笔记K-means算法,是比较简单的无监督的算法,通过设定好初始的类别k,然后不断循环迭代,将给定的数据自动分为K个类别。事实上,大家都知道K-means是怎么算的,但实际上,它是GMM(高斯混合模型)的一个特例,其而GMM是基于EM算法得来的,所以本文,将对K-means算法的算法思想......
  • EM算法笔记
    EM算法笔记背景    EM(Expectation-Maximum)算法也称期望最大化算法,是最常见的隐变量估计方法,它的思想在很多算法上有所体现。例如高斯混合模型(Gaussianmixturemodel,简称GMM)的参数;隐式马尔科夫算法(HMM)、LDA主题模型的变分推断、还有VAE、GAN等等。    在机器学习算......
  • 一定要收藏的PKPM学习笔记
    01裂缝与挠度裂缝,模型里计算裂缝是按矩形截面计算弯矩,而不考虑翼缘影响,实际上翼缘影响是很大的,也就是说模型计算出的结果裂缝偏大,一般梁支座裂缝不考虑,因为本来强柱弱梁也是要出现塑性铰的,但是梁底部裂缝要考虑,而且梁尤其是KL底筋配筋结果最好比计算结构稍大,也就是弯矩调幅0.8而不......
  • 基于ASP.NET轻笔记系统设计与实现
    移动互联网时代,用户接触的信息爆炸式增长,有效储存和管理信息是现阶段面临的挑战。在云计算中起基础支撑作用的云存储,可作为一种服务提供给用户,为解决现在面临的多终端跨平台个人文件存取困境提供了良好的技术基础。经过本人的综合考虑,轻笔记系统的设计是基于asp.net技术+sqlserver......
  • 【黑马C++笔记】(二)实战:通讯录管理系统
    通讯录管理系统1、系统需求通讯录是一个可以记录亲人、好友信息的工具。本教程主要利用C++来实现一个通讯录管理系统系统中需要实现的功能如下:添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录1000人显示联系人:显示通讯录中所有联系人信......
  • 【黑马C++笔记】(一)C++基础语法入门
    C++基础入门1C++初识1.1第一个C++程序编写一个C++程序总共分为4个步骤创建项目创建文件编写代码运行程序1.1.1创建项目​ VisualStudio是我们用来编写C++程序的主要工具,我们先将它打开1.1.2创建文件右键源文件,选择添加->新建项给C++文件起个名称,然后点击添......
  • Qt+QtWebApp开发笔记(五):http服务器html中使用json触发ajax与后台交互实现数据更新传递
    前言  前面完成了页面的跳转、登录,很多时候不刷新页面就想刷新局部数据,此时ajax就是此种技术,且是异步的。  本篇实现网页内部使用js调用ajax实现异步交互数据。  在js中使用ajax是通过XMLHttpRequest来实现的。下载地址  链接:https://pan.baidu.com/s/1tJMTPhIIyVE40......
  • 程序员修炼之道阅读笔记
    第44节全都是写1、代码要跟文档紧密结合,我们要认真对待注释及文档,他们不是可有可无的东西。2、我们喜欢看到简单的模块级头注释,关于重要数据和类型声明的注释,以及给每个类和每个方法所加的简要头注释,用于描述函数的用法和任何不明了的事情。3、应当使用特定的格式进行注释,通常......