Java进阶-SpringCloud使用BeanUtil工具类简化对象之间的属性复制和操作

news2024/10/7 13:14:44

在Java编程中,BeanUtil工具类是一种强大且便捷的工具,用于简化对象之间的属性复制和操作。本文将介绍BeanUtil的基本功能,通过详细的代码示例展示其应用,并与其他类似工具进行对比。本文还将探讨BeanUtil在实际开发中的优势和使用场景,帮助开发者更好地理解和应用这一工具类。

在这里插入图片描述

一、BeanUtil 工具类介绍

1. BeanUtil 简述

BeanUtil是一个广泛使用的Java工具类,提供了一系列方法来简化JavaBean对象之间的属性复制和操作。它主要用于解决复杂的对象操作和属性处理问题,显著提高代码的可读性和维护性。

BeanUtils是浅拷贝,对基本数据类型进行值传递,对引用数据类型,使用其引用地址,不拷贝其内容。与之对应的是深拷贝,深拷贝是对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容。

2. BeanUtil 功能

BeanUtil的核心功能包括:

  • 属性复制:将一个对象的属性复制到另一个对象中。
  • 属性设置和获取:动态地设置和获取对象的属性值。
  • 类型转换:支持基本类型和包装类型之间的转换。

以下是BeanUtil的一些常用功能及其描述:

功能描述
copyProperties将一个对象的属性值复制到另一个对象中
setProperty设置对象的指定属性值
getProperty获取对象的指定属性值
cloneBean克隆一个对象,生成其副本
populate使用Map数据填充对象的属性
describe将对象的属性和值转换为Map

3. 与同类对象/属性操作库的对比

除了BeanUtil,还有许多类似的工具类和库可以实现对象属性复制和操作。

以下是一些常见的同类工具:

  • Apache Commons BeanUtils

    • 提供了一系列用于操作JavaBean的实用工具方法,包括属性复制、属性设置和获取等。它是一个开源库,广泛用于Java项目中。
  • Spring BeanUtils

    • 由Spring Framework提供的工具类,提供了简单的属性复制和操作方法。它在Spring应用程序中非常常见,特别适用于Spring生态系统内的项目。
  • Dozer

    • 一个Java Bean到Java Bean的映射器,支持深度复制和复杂的映射需求。它允许自定义映射配置,适用于需要进行复杂对象转换的场景。
  • ModelMapper

    • 一种智能的对象映射框架,旨在简化对象之间的映射。它提供了强大的映射功能,能够处理复杂的对象关系和类型转换。
  • MapStruct

    • 一种编译时代码生成器,自动生成类型安全、高性能的Bean映射代码。它通过注解驱动的方式定义映射关系,减少运行时的开销。
  • Orika

    • 一个Java Bean映射器,专注于提供快速且简单的对象映射功能。它支持复杂的映射配置和多种映射策略,适用于需要高性能映射的项目。

下表对这些工具类的主要功能进行对比:

工具类属性复制属性设置和获取类型转换性能配置复杂度
BeanUtil中等
Apache BeanUtils
Spring BeanUtils
Dozer中等
ModelMapper中等中等
MapStruct
Orika中等中等

这些工具类和库各有特点,开发者可以根据项目需求选择最合适的工具。例如,Apache Commons BeanUtils和Spring BeanUtils适合简单的属性复制,而Dozer和ModelMapper则适合处理复杂的对象映射和转换需求。MapStruct和Orika则在性能和类型安全方面表现出色。


二、BeanUtil 工具类使用示例

1. 属性复制

属性复制是BeanUtil最常用的功能之一,可以将一个对象的所有属性值复制到另一个对象中。

+-------------------+    BeanUtil    +-------------------+
|   Source Object   | -------------->|   Target Object   |
|-------------------|  复制属性       |-------------------|
|  name: "John"     |                |  name: "John"     |
|  age: 30          |                |  age: 30          |
+-------------------+                +-------------------+

以下是示例代码:

import org.apache.commons.beanutils.BeanUtils;

public class BeanUtilExample {
    public static void main(String[] args) {
        try {
            SourceObject source = new SourceObject("John", 30);
            TargetObject target = new TargetObject();
            
            BeanUtils.copyProperties(target, source);
            
            System.out.println("Target Object: " + target);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class SourceObject {
    private String name;
    private int age;

    public SourceObject(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // getters and setters
}

class TargetObject {
    private String name;
    private int age;

    @Override
    public String toString() {
        return "TargetObject [name=" + name + ", age=" + age + "]";
    }

    // getters and setters
}

在这个示例中,copyProperties方法将source对象的属性值复制到target对象中。

2. 属性设置和获取

BeanUtil还提供了动态设置和获取对象属性的方法。

以下是示例代码:

import org.apache.commons.beanutils.BeanUtils;

public class PropertyExample {
    public static void main(String[] args) {
        try {
            MyBean myBean = new MyBean();
            BeanUtils.setProperty(myBean, "name", "Alice");
            BeanUtils.setProperty(myBean, "age", 25);

            String name = BeanUtils.getProperty(myBean, "name");
            String age = BeanUtils.getProperty(myBean, "age");

            System.out.println("Name: " + name);
            System.out.println("Age: " + age);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class MyBean {
    private String name;
    private int age;

    // getters and setters
}

3. 对象克隆

BeanUtil还可以克隆对象,生成其副本。

以下是示例代码:

import org.apache.commons.beanutils.BeanUtils;

public class CloneExample {
    public static void main(String[] args) {
        try {
            MyBean original = new MyBean("Bob", 40);
            MyBean clone = (MyBean) BeanUtils.cloneBean(original);

            System.out.println("Original: " + original);
            System.out.println("Clone: " + clone);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class MyBean {
    private String name;
    private int age;

    public MyBean() {}

    public MyBean(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "MyBean [name=" + name + ", age=" + age + "]";
    }

    // getters and setters
}

在这个示例中,cloneBean方法创建了original对象的一个副本。


三、BeanUtil 工具类总结

BeanUtil工具类为Java开发者提供了一种简便的方法来操作JavaBean对象的属性。通过使用BeanUtil,开发者可以减少重复代码,提高开发效率,增强代码的可读性和可维护性。尽管有许多类似的工具类和库,BeanUtil凭借其简单易用和强大的功能,仍然是许多项目中的首选。选择合适的工具类应根据项目的具体需求和复杂度来决定。对于简单的属性复制和操作,BeanUtil无疑是一个优秀的选择。而对于复杂的映射需求,可能需要考虑使用其他更为强大的映射工具。希望本文通过详细的介绍和示例代码,能够帮助开发者更好地理解和应用BeanUtil工具类,提高开发效率和代码质量。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1690266.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QML英文拟态键盘,英文数字符号输入法

文章目录 QML 英文拟态键盘思维导图更多细节欢迎私信效果图:核心代码:KeyboardLetter.qml,**CustomerKeyboard.qml**,Example.qmlCustomerKeyboard.qmlButton.qmlButtonBase.qmlButtonStateImage.qmlDialogBase.qmlExample.qmlIma…

必示科技参与智能运维国家标准预研线下编写会议并做主题分享

近日,《信息技术服务 智能运维 第3部分:算法治理》(拟定名)国家标准预研阶段第一次编写工作会议在杭州举行。本次会议由浙商证券承办。 此次编写有来自银行、证券、保险、通信、高校研究机构、互联网以及技术方等29家单位&#xf…

ESP32 实现获取天气情况

按照小安派AiPi-Eyes天气站思路,在ESP32 S3上实现获取天气情况。 一、在ESP32 S3实现 1、main.c 建立2个TASK void app_main(void) {//lvgl初始化xTaskCreate(guiTask, "guiTask", 1024 * 6, NULL, 5, NULL);//wifi初始化、socket、json处理taskcustom_…

ue5 中ps使用记录贴

一、快捷键记录 放大图形 ctrlalt空格 放大图形 缩小视口 ctrl空格 ctrlD 取消选区 ctrlt缩小文字 w魔棒工具 选择魔棒的时候把容差打开的多一点 二、案例 移动文字 在相应的图层选择 移动文字 修改图片里的颜色 在通道里拷贝红色通道,复制红色通道粘贴给正常图…

Softing工业将亮相2024年阿赫玛展会——提供过程自动化的连接解决方案

您可于2024年6月10日至14日前往美因河畔法兰克福11.0号馆,Softing将在C25展位展出,欢迎莅临! 作为工业应用中数据交换领域公认的专家,Softing工业致力于帮助各行各业的客户部署网络自动化和优化生产流程。 使用Softing产品&…

kind: Telemetry

访问日志 访问日志提供了一种从单个工作负载实例的角度监控和理解行为的方法。 Istio 能够以一组可配置的格式为服务流量生成访问日志, 使操作员可以完全控制日志记录的方式、内容、时间和地点。 有关更多信息,请参阅获取 Envoy 的访问日志。 https:/…

TAS5711带EQ和DRC支持2.1声道的20W立体声8V-26V数字输入开环D类数字功放音频放大器

前言 数字功放很难搞,寄存器很多,要配置正确才有声音,要想声音好,要好好调整。 TAS5711出道很多年了,现在仍然在不少功放、音箱中能看到。 TAS5711特征 音频输入/输出 从 18V 电源向 8Q 负载提供 20W 功率 宽 PVDD…

Plesk面板中如何导出的MS SQL server数据库

需要导出我的SQL Server 的数据库文件,由于我使用的Hostease的Windows虚拟主机产品默认带普通用户权限的Plesk面板,但是不知道如何在Plesk上操作导出,因为也是对于Hostease主机产品不是很了解,因此联系Hostease的咨询了Hostease技…

[论文笔记]Chain-of-Thought Prompting Elicits Reasoning in Large Language Models

引言 今天带来思维链论文 Chain-of-Thought Prompting Elicits Reasoning in Large Language Models的笔记。 作者探索了如何通过生成一系列中间推理步骤的思维链,显著提升大型语言模型在进行复杂推理时的能力。 1 总体介绍 语言模型的规模扩大已被证明能够带来…

redis--告警处理设置密码连接

解决当前告警提示 告警一 backlog参数控制的是三次握手的时候server端收到client ack确认号之后的队列值,即全连接队列 vim /etc/sysctl.conf net.core.somaxconn 1024sysctl -p 告警二 内核参数 0、表示内核将检查是否有足够的可用内存供应用进程使用&#xff1…

第八节 条件装配案例讲解

一、条件装配的作用是什么 条件装配是 Spring 框架中一个强大的特性&#xff0c;使得开发者能够创建更加灵活和可维护的应用程序。在 Spring Boot 中&#xff0c;这个特性被大量用于自动配置&#xff0c;极大地简化了基于 Spring 的应用开发。 二、条件装配注解 <dependen…

STM32_HAL_FLASH 模拟 EEPROM

1. STM32 FLASH简介 STM32F407ZGT6 的 FLASH 容量为1024K 字节&#xff0c; STM32F40xx/41xx 的闪存模块组织如图 STM32F4 的闪存模块由主存储器、系统存储器、 OPT 区域和选项字节等 4 部分组成。 主存储器&#xff0c;该部分用来存放代码和数据常数&#xff08;如 const 类型…

macOS平台安装PostgreSQL的五种方法

macOS 平台安装 PostgreSQL 数据库主要有以下五种方法。 EDB安装工具 EDB 公司提供的图像安装工具&#xff0c;支持 macOS 以及 Windows 平台。该工具可以安装 PostgreSQL 服务器、pgAdmin&#xff08;管理开发工具&#xff09;以及 StackBuilder&#xff08;安装 PostgreSQL…

漫画|基于SprinBoot+vue的漫画网站(源码+数据库+文档)

漫画网站 目录 基于SprinBootvue的漫画网站 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 3用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大…

0基础学习Mybatis系列数据库操作框架——Mysql的Geometry数据处理之WKB方案

大纲 序列化反序列化完整TypeHandlerSQL XML完整XML Mapper测试代码代码 在《0基础学习Mybatis系列数据库操作框架——Mysql的Geometry数据处理之WKT方案》中&#xff0c;我们介绍WTK方案的优点&#xff0c;也感受到它的繁琐和缺陷。比如&#xff1a; 需要借助ST_GeomFromText…

数据意外删除?安卓手机数据恢复教程来帮你解救

手机不仅仅是一个通讯工具&#xff0c;更是我们记录生活、工作、学习等各种信息的重要载体&#xff0c;无论是拍照、录音、录像&#xff0c;还是文字记录&#xff0c;手机都能轻松完成。可有时候我们会不小心删除一些重要的数据&#xff0c;这时候我们该怎么办呢&#xff1f;别…

LeetCode/NowCoder-链表经典算法OJ练习3

孜孜不倦&#xff1a;孜孜&#xff1a;勤勉&#xff0c;不懈怠。指工作或学习勤奋不知疲倦。&#x1f493;&#x1f493;&#x1f493; 目录 说在前面 题目一&#xff1a;返回倒数第k个节点 题目二&#xff1a;链表的回文结构 题目三&#xff1a;相交链表 SUMUP结尾 说在前…

分布式锁2-Zookeeper分布式锁实战

Zookeeper分布式锁实战 使用curator操作Zookeeper进行实战&#xff1b; curator是什么&#xff1a;Apache Curator包含一套高级API框架和工具类&#xff0c;它 是Apache ZooKeeper 的Java 客户端库。 准备 pom文件引入curtor依赖和zookeeper依赖 <!--curator--> <…

微信小程序开发环境的搭建

一、注册微信小程序账号 二、安装微信开发者工具 1.下载微信开发者工具。 官网下载地址&#xff1a;https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/downloads.html 2、选择稳定版Window64下载安装 3、下载完毕后&#xff0c;点击下一步安装 三、使用微信开发者工具…

linux---信号的捕捉和处理

提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、信号 可以简单理解为信号是一个进程给另一个信号发消息&#xff0c;进程收到对应的信号就执行对应的方法&#xff0c;linux信号可以分为实时信号和非实时信号 1-31为非实时信号&#xff0c;34-64为…