Spring Framework常用工具类

系列文章目录

Spring Framework常用工具类



前言

记录Spring Framework中的一些常用工具类,以及原理,避免错误使用导致未知错误。


一、BeanUtils

org.springframework.beans.BeanUtils 是 Spring Framework 提供的一个核心工具类,位于 spring-beans 模块中。其核心职责是简化 Java Bean 的各种操作,主要包括以下几个方面:

  1. 属性拷贝

    • 提供 copyProperties() 方法实现 Bean 属性间的复制
    • 支持不同类型对象间的属性拷贝(如 DTO 转 Entity)
    • 示例场景:Controller 层接收的 DTO 对象转换为 Service 层的 Entity 对象
  2. 类型转换

    • 内置基本数据类型转换功能
    • 支持通过 PropertyEditor 进行自定义类型转换
    • 示例:将字符串 “true” 转换为 Boolean 类型
  3. 实例化操作

    • 提供 instantiateClass() 方法动态创建对象实例
    • 支持通过构造函数参数实例化对象
    • 常用于反射创建对象场景
  4. 方法查找与调用

    • 提供 findMethod() 方法查找指定方法
    • 包含 invokeMethod() 方法实现方法调用
    • 在 AOP 等需要反射调用的场景中广泛使用
  5. 其他实用功能

    • 属性描述符获取
    • 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) : "";
    }
}

注册与使用

  1. 注册自定义编辑器
    通过 PropertyEditorRegistrar 或直接在 WebDataBinder 中注册:

    @Controller
    public class MyController {
        @InitBinder
        public void initBinder(WebDataBinder binder) {
            binder.registerCustomEditor(Date.class, new CustomDateEditor("yyyy-MM-dd"));
        }
    }
    
  2. 在表单绑定中使用
    Spring MVC 会自动调用注册的 PropertyEditor 处理请求参数:

    @PostMapping("/submit")
    public String handleSubmit(@ModelAttribute MyForm form) {
        // form 中的 Date 字段已自动转换
        return "success";
    }
    

内置常用编辑器

Spring 提供了多种内置 PropertyEditor,例如:

  • CustomBooleanEditor:处理布尔值转换。
  • CustomNumberEditor:处理数字类型转换。
  • StringTrimmerEditor:自动修剪字符串两端的空格。

注意事项

  • 线程安全:避免在 PropertyEditor 中维护状态,建议每次转换创建新实例或使用线程安全实现。
  • 性能优化:频繁使用的类型建议通过注册全局编辑器提升性能。

总结

spring原生工具对代码编写有很大帮助,有些工具还是需要知道。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值