系列文章目录
Spring Framework常用工具类
前言
记录Spring Framework中的一些常用工具类,以及原理,避免错误使用导致未知错误。
一、BeanUtils
org.springframework.beans.BeanUtils 是 Spring Framework 提供的一个核心工具类,位于 spring-beans 模块中。其核心职责是简化 Java Bean 的各种操作,主要包括以下几个方面:
-
属性拷贝:
- 提供
copyProperties()方法实现 Bean 属性间的复制 - 支持不同类型对象间的属性拷贝(如 DTO 转 Entity)
- 示例场景:Controller 层接收的 DTO 对象转换为 Service 层的 Entity 对象
- 提供
-
类型转换:
- 内置基本数据类型转换功能
- 支持通过
PropertyEditor进行自定义类型转换 - 示例:将字符串 “true” 转换为 Boolean 类型
-
实例化操作:
- 提供
instantiateClass()方法动态创建对象实例 - 支持通过构造函数参数实例化对象
- 常用于反射创建对象场景
- 提供
-
方法查找与调用:
- 提供
findMethod()方法查找指定方法 - 包含
invokeMethod()方法实现方法调用 - 在 AOP 等需要反射调用的场景中广泛使用
- 提供
-
其他实用功能:
- 属性描述符获取
- Bean 属性类型判断
- 空值安全处理
典型应用场景包括:
- MVC 框架中的参数绑定
- ORM 框架中的对象映射
- 配置属性的注入
- 单元测试中的对象模拟
相比 Apache Commons BeanUtils,Spring 的实现更加轻量高效,且与 Spring 生态深度集成,是 Spring 项目中处理 Java Bean 的首选工具类。
1.copyProperties
属性拷贝,将一个对象的同名属性拷贝置另一个对象
public static void copyProperties(Object source, Object target) throws BeansException {
copyProperties(source, target, null, (String[]) null);
}
// 手动忽略某些属性
public static void copyProperties(Object source, Object target, String... ignoreProperties) throws BeansException {
copyProperties(source, target, null, ignoreProperties);
}
注意事项:
- 仅拷贝同名属性,要求源和目标属性名称完全一致
- 类型兼容:通过`ClassUtils.isAssignable(targetType, sourceType)判断;
- 允许子类赋值给父类
- 允许基本类型和包装类型互相复制
- 忽略不可写属性:目标需要set方法,没有则跳过
- 忽略不可读属性:源无get跳过
- 不处理嵌套属性
- 可以手动设置忽略不拷贝的属性
2.PropertyEditor
基本概念
org.springframework.beans.BeanUtils.PropertyEditor 是 Spring 框架中用于处理属性编辑的核心接口,主要用于将字符串值转换为目标类型的对象(或反向转换)。通常与 PropertyEditorSupport 结合使用,实现自定义类型转换逻辑。
核心方法
setAsText(String text)
将字符串转换为目标类型的对象,需在自定义编辑器中实现逻辑。getAsText()
将目标类型的对象转换为字符串表示形式。
实现示例
以下是一个自定义 PropertyEditor 的示例,用于将字符串转换为 Date 类型:
import java.beans.PropertyEditorSupport;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class CustomDateEditor extends PropertyEditorSupport {
private final SimpleDateFormat dateFormat;
public CustomDateEditor(String datePattern) {
this.dateFormat = new SimpleDateFormat(datePattern);
}
@Override
public void setAsText(String text) throws IllegalArgumentException {
try {
Date date = dateFormat.parse(text);
setValue(date); // 设置转换后的值
} catch (ParseException e) {
throw new IllegalArgumentException("日期格式错误: " + text);
}
}
@Override
public String getAsText() {
Date date = (Date) getValue();
return date != null ? dateFormat.format(date) : "";
}
}
注册与使用
-
注册自定义编辑器
通过PropertyEditorRegistrar或直接在WebDataBinder中注册:@Controller public class MyController { @InitBinder public void initBinder(WebDataBinder binder) { binder.registerCustomEditor(Date.class, new CustomDateEditor("yyyy-MM-dd")); } } -
在表单绑定中使用
Spring MVC 会自动调用注册的PropertyEditor处理请求参数:@PostMapping("/submit") public String handleSubmit(@ModelAttribute MyForm form) { // form 中的 Date 字段已自动转换 return "success"; }
内置常用编辑器
Spring 提供了多种内置 PropertyEditor,例如:
CustomBooleanEditor:处理布尔值转换。CustomNumberEditor:处理数字类型转换。StringTrimmerEditor:自动修剪字符串两端的空格。
注意事项
- 线程安全:避免在
PropertyEditor中维护状态,建议每次转换创建新实例或使用线程安全实现。 - 性能优化:频繁使用的类型建议通过注册全局编辑器提升性能。
总结
spring原生工具对代码编写有很大帮助,有些工具还是需要知道。

4728

被折叠的 条评论
为什么被折叠?



