一、BeanUtils 的核心作用

BeanUtils 是 Apache Commons 和 Spring Framework 提供的工具类,主要用于简化 JavaBean 的操作。核心功能包括:

  1. 属性拷贝:对象间同名属性自动复制
  2. 动态访问:通过字符串名称操作属性
  3. 类型转换:自动处理不同类型间的转换
  4. 嵌套访问:支持 address.city 格式的链式访问

📌 JavaBean 定义:符合规范的 POJO 类

  • 有无参构造函数
  • 属性私有化
  • 提供 getter/setter 方法

二、Apache Commons BeanUtils

核心方法
方法作用示例
copyProperties(dest, orig)复制同名属性BeanUtils.copyProperties(userDTO, user);
getProperty(bean, name)获取属性值String name = BeanUtils.getProperty(user, "name");
setProperty(bean, name, value)设置属性值BeanUtils.setProperty(user, "age", "30");
describe(bean)对象转 MapMap<String, String> map = BeanUtils.describe(user);
populate(bean, properties)Map 转对象BeanUtils.populate(user, map);

 使用示例

// 添加依赖
// <dependency>
//     <groupId>commons-beanutils</groupId>
//     <artifactId>commons-beanutils</artifactId>
//     <version>1.9.4</version>
// </dependency>import org.apache.commons.beanutils.BeanUtils;public class CommonsExample {public static void main(String[] args) throws Exception {// 1. 创建源对象User source = new User("Alice", 25, new Address("New York"));// 2. 创建目标对象UserDTO target = new UserDTO();// 3. 属性拷贝(同名属性自动复制)BeanUtils.copyProperties(target, source);System.out.println(target); // 输出: UserDTO{name='Alice', age=25, city='New York'}// 4. 动态获取属性String city = BeanUtils.getProperty(source, "address.city");System.out.println(city); // 输出: New York// 5. 动态设置属性BeanUtils.setProperty(target, "age", "30"); // 字符串自动转int// 6. 对象转MapMap<String, String> map = BeanUtils.describe(source);System.out.println(map); // {name=Alice, age=25, address=Address[city=New York]}// 7. Map转对象Map<String, Object> data = new HashMap<>();data.put("name", "Bob");data.put("age", "35"); // 字符串自动转换data.put("address.city", "London"); // 嵌套属性User newUser = new User();BeanUtils.populate(newUser, data);System.out.println(newUser.getAddress().getCity()); // 输出: London}
}// JavaBean 类
class User {private String name;private int age;private Address address;// 无参构造器、getter/setter 省略
}class UserDTO {private String name;private int age;private String city; // 对应 address.city// 无参构造器、getter/setter 省略
}class Address {private String city;// 构造器、getter/setter 省略
}

 

 

三、Spring BeanUtils

核心方法(更简洁高效)
方法作用特点
copyProperties(source, target)属性复制无类型转换,性能更好
copyProperties(source, target, ignoreProperties)带忽略属性的复制跳过指定属性

 

 使用示例

// 添加依赖
// <dependency>
//     <groupId>org.springframework</groupId>
//     <artifactId>spring-beans</artifactId>
//     <version>5.3.20</version>
// </dependency>import org.springframework.beans.BeanUtils;public class SpringExample {public static void main(String[] args) {User source = new User("Alice", 25, new Address("New York"));UserDTO target = new UserDTO();// 1. 基础属性复制BeanUtils.copyProperties(source, target);System.out.println(target.getCity()); // 输出: null (不自动处理嵌套)// 2. 带忽略属性的复制BeanUtils.copyProperties(source, target, "age"); // 忽略age属性System.out.println(target.getAge()); // 输出: 0 (默认值)// 3. 自定义属性处理器class CustomConverter implements Converter {public Object convert(Class type, Object value) {if(value instanceof User) {return ((User) value).getAddress().getCity();}return null;}}// 4. 处理嵌套属性(需自定义)String city = (String) new CustomConverter().convert(String.class, source);target.setCity(city);System.out.println(target.getCity()); // 输出: New York}
}

 

四、最佳实践与注意事项

1. 选择指南
场景推荐工具
需要类型转换Apache BeanUtils
高性能场景Spring BeanUtils
嵌套属性访问Apache BeanUtils
简单属性复制Spring BeanUtils
2. 性能对比
3. 常见问题解决

问题1:嵌套属性复制失败

// Apache 解决方案
BeanUtils.setProperty(target, "address.city", "Paris");// Spring 解决方案(需自定义)
class AddressMapper {public static void map(User source, UserDTO target) {target.setCity(source.getAddress().getCity());}
}

问题2:类型转换错误

// 注册自定义转换器
ConvertUtils.register(new Converter() {public Object convert(Class type, Object value) {return LocalDate.parse(value.toString());}
}, LocalDate.class);// 现在可以处理字符串转LocalDate
BeanUtils.setProperty(target, "birthDate", "2023-01-01");

问题3:忽略特定属性

// Spring 方式
BeanUtils.copyProperties(source, target, "password", "sensitiveData");// Apache 方式(需额外处理)
Map<String, String> map = BeanUtils.describe(source);
map.remove("password");
BeanUtils.populate(target, map);

五、实际应用场景

场景1:DTO/VO 转换
// Controller层
public UserDTO getUser(Long id) {User user = userService.findById(id);UserDTO dto = new UserDTO();BeanUtils.copyProperties(user, dto);return dto;
}
场景2:表单对象绑定
// 接收表单提交
public String createUser(@ModelAttribute UserForm form) {User user = new User();BeanUtils.copyProperties(form, user);userService.save(user);return "redirect:/users";
}
场景3:动态配置注入
// 从配置文件中读取设置
@Value("${app.settings}")
private Map<String, String> settings;public void applySettings() {AppConfig config = new AppConfig();BeanUtils.populate(config, settings);
}
场景4:对象合并
public User mergeUserChanges(User original, User changes) {User merged = new User();BeanUtils.copyProperties(original, merged); // 复制原始数据BeanUtils.copyProperties(changes, merged);  // 覆盖变更数据return merged;
}

总结:BeanUtils 作用

  1. 消除样板代码:减少 getter/setter 调用
  2. 提升开发效率:简化对象操作
  3. 增强灵活性:支持动态属性访问
  4. 降低耦合度:解耦对象操作逻辑

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PyCharm高效开发全攻略

安装与基础配置下载PyCharm专业版或社区版&#xff08;免费&#xff09;并完成安装。首次启动时选择默认设置或自定义主题、字体大小等界面偏好。配置Python解释器路径&#xff08;推荐使用虚拟环境&#xff09;&#xff0c;确保项目依赖隔离。快捷键与导航熟悉核心快捷键能大幅…

Pycharm 给 python 程序打包EXE的配置和方法

前言: Python 语言的设计变得越来越简单,它有很多可以使用的库,所以尤其在人工智能时代,Python语言被广泛应用。但是Python语言和windows系统的兼容性稍微偏弱,如何生成windows可以执行的exe文件。是要一个很复杂的配置过程,本文就会做一个介绍。 本文,通过一个Python…

【Linux | 网络】传输层(UDP和TCP)

目录一、再谈端口号1.1 端口号1.2 端口号的范围划分1.3 常见知名端口号1.4 netstat 命令1.5 进程与端口号的关系1.6 pidof 命令二、UDP协议2.1 UDP协议段格式2.2 如何理解UDP报头和UDP报文2.2.1 UDP报头2.2.2 UDP报文和UDP报文的管理2.2.3 UDP封装过程2.3 UDP的特点2.4 UDP的缓…

mybatisX的自定义模板生成

在idea中使用mybtais的自定义模板生成&#xff0c;可以帮我们省去很多重复的代码。 打开一个项目&#xff0c;我们要修改的主要就两个文件&#xff0c;一个是生成的mapper接口&#xff0c;另一个是xml文件&#xff1a; 相应的mapper接口模板为&#xff1a; package ${mapper…

miniz:一个轻量级、高性能的开源压缩库

目录 1.简介 2.核心特性 3.基本使用示例 4.与 ZLIB 的对比 5.使用场景 6.注意事项 1.简介 miniz 是一个轻量级、高性能的开源压缩库&#xff0c;专注于提供 ZLIB/GZIP 兼容的压缩和解压缩功能。它的核心优势在于体积小巧&#xff08;单文件实现&#xff09;、跨平台支持和…

Jenkins接口自动化测试(构建)平台搭建

Python接口自动化测试零基础入门到精通&#xff08;2025最新版&#xff09;自动化测试流程 在进行平台搭建前&#xff0c;我们首先要问自己&#xff1a;我需要搭建的平台的功能是什么&#xff0c;要实现什么目标&#xff1f; 在我的理解中&#xff0c;自动化构建平台的执行流…

Day 22: 复习

机器学习数据处理与降维技术复习总结 前言 经过6天的学习&#xff0c;我们系统地学习了从基础的Numpy数组操作到高级的降维算法&#xff0c;这些内容构成了机器学习数据预处理的重要知识体系。本文将对这一系列学习内容进行全面复习和总结&#xff0c;帮助大家建立完整的知识…

力扣 hot100 Day56

46. 全排列 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 //抄的 class Solution { private:vector<vector<int>>result;vector<int> path; public:void backtracking(vector<int>& nu…

Android 编码规范全指南

在 Android 开发领域&#xff0c;代码不仅是功能实现的载体&#xff0c;更是团队协作与项目迭代的基础。一套完善的编码规范&#xff0c;能让代码从 “可运行” 升级为 “易维护、可扩展、低风险”。本文基于 Google、Square 等顶尖团队的实践经验&#xff0c;结合国内 Android…

[RPA] Excel中的字典处理

案例1一个Excel文件总共有2个Sheet页&#xff0c;分别为总表和对照表通过对照表sheet页&#xff0c;设置价格对照字典对照表循环总表sheet页&#xff0c;根据循环到的商品名称&#xff0c;找到对应字典中的价格&#xff0c;并计算出总价总表将总价写入到Excel表中C列&#xff0…

基于NSGAII优化算法的车间生产调度matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.部分程序 4.算法理论概述 5.参考文献 6.完整程序 1.程序功能描述 车间生产调度是制造业的核心环节&#xff0c;其目标是在满足设备约束、工序优先级等条件下&#xff0c;优化多个相互冲突的生产指标&#xff08;如…

Cmake、VS2019、C++、openGLopenCV环境安装

在 CMake 和 Visual Studio 2019 环境下安装和配置 OpenGL、OpenCV 以及 CUDA 可能会有些复杂&#xff0c;因为涉及的组件多且相互依赖。以下是一个详细的指南&#xff0c;帮助您逐步完成安装和配置。 1. 前提条件 在开始之前&#xff0c;请确保您已安装以下软件&#xff1a; …

视频二维码在产品设备说明书中的应用

在当今数字化的时代&#xff0c;传统的产品设备说明书正面临着一场变革。文字和图片虽然能提供基本信息&#xff0c;但在复杂设备的安装、操作和故障排除方面&#xff0c;往往显得力不从心。而视频二维码的出现&#xff0c;为这一困境提供了完美的解决方案&#xff0c;它将冰冷…

【Pytest 使用教程】

pytest 使用 test_basic.py Pytest 完全实战手册 一、核心概念与基础 1、在pytest框架下运行测试用例&#xff0c;最基础的一共有三点。导入pytest的包写一个方法&#xff0c;或者类。后面运行的时候&#xff0c;相当于运行这个方法&#xff0c;或者类里的方法&#xff0c;无需…

基于OpenOCD 的 STM32CubeIDE 开发烧录调试环境搭建 DAPLINK/STLINK

需要部署一个开发环境,实现h7的板子通过daplink功能给目标板烧写程序(同事要将这个过程用fpga实现),需要通过openocd+gdb+daplink stm32; 总结:单条命令执行太麻烦,参考4写成脚本文件: 独立脚本使用Openocd ​ 在**“在Stm32CubeIDE环境下使用DAP-Link仿真”**一文中…

嵌入式硬件篇---zigbee无线串口通信问题

使用 ZigBee 进行无线串口通信时&#xff0c;接收异常&#xff08;如丢包、乱码、完全无法接收&#xff09;是常见问题&#xff0c;其原因涉及射频通信特性、网络机制、硬件配置、环境干扰等多个层面。以下从具体机制出发&#xff0c;详细分析可能的原因&#xff1a;一、射频层…

【AI周报】2025年7月26日

【AI周报】2025年7月第四周观察&#xff1a;GitHub Spark重塑开发范式&#xff0c;中美AI政策对垒升级 省流版静态页面周报&#xff0c;为方便各位看官快速食用&#xff0c;我准备了摘要版周报&#xff0c;欢迎访问&#xff1a;20250726周报 引言&#xff1a;本周焦点速览 2…

HTML:从 “小白” 到 “标签侠” 的修炼手册

目录 一、HTML&#xff1a;网页的 “骨架” 不是骷髅架 二、文本标签&#xff1a;文字的 “华丽变身” 术 1. 标题标签&#xff1a;文字界的 “领导班子” 2. 段落标签&#xff1a;文字的 “专属保姆” 3. 文本格式化标签&#xff1a;给文字 “穿花衣” 三、链接标签&…

python3GUI--基于YOLO的火焰与烟雾检测系统By:PyQt5(详细图文介绍)

文章目录一&#xff0e;前言1.引言2.正文二&#xff0e;核心内容1.数据集2.模型训练3.界面窗口1.登录注册界面2.核心功能界面3.检测告警提示窗口三&#xff0e;.核心界面模块介绍1.顶部信息区域2.数据输入3.参数配置4.告警设置5.操作台6.关于7.指标变化8.异常速览9.日志输出10.…

基于Transform、ARIMA、LSTM、Prophet的药品销量预测分析

文章目录有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主一、项目背景二、数据准备与预处理三、模型选择与方法设计1. ARIMA 模型&#xff1a;传统统计方法的基线构建2. LSTM 模型&#xff1a;引入记忆机制的深度学习方法3. Transformer 模型&#…