Spring 内置工具类整理:减少重复代码的 20 个实用类

这篇文章系统整理了 Spring 内置的常用工具类,包括字符串、集合、对象、IO、反射、加密等场景,适合在 SpringBoot 项目里替换大量重复模板代码。

Spring 内置工具类

在 Java 开发中,我们每天都会重复写大量模板代码:

  • 字符串是否为空?
  • 集合是否为 null 或空?
  • 如何安全地反射调用私有字段?
  • 怎样快速拷贝文件或读取流?
  • 如何做一次 MD5 加密?

这些看似“小事”,却耗费大量时间,还容易引入空指针(NPE)、编码错误等低级 Bug。

其实,Spring Framework(尤其是 spring-core 模块)早已为我们准备好了 20 多个高质量、经过生产验证的工具类。它们开箱即用、覆盖全面、健壮可靠,能显著减少样板代码,提升开发效率与系统稳定性。

下面我将按类别详细介绍这些工具类,不仅给出了示例,还解释关键方法的作用与适用场景,帮助你真正掌握并高效使用!


一、常用基础工具类

1. StringUtils —— 字符串处理专家

核心优势:空安全、白空格敏感判断,避免手写 str != null && !str.trim().isEmpty()

String s = " hello ";  
boolean hasText = StringUtils.hasText(s);        // true(非 null 且含非空白字符)  
boolean hasLength = StringUtils.hasLength(s);     // true(长度 > 0,含空格也算)  
  
String trimmed = StringUtils.trimWhitespace(s);   // "hello"  
String cleaned = StringUtils.trimAllWhitespace(s); // "hello"(移除所有空白,包括中间空格)

典型场景:表单校验、日志打印前判空、配置项检查。


2. CollectionUtils —— 集合安全操作

核心方法:统一处理 null 和空集合,避免 NPE。

List<String> list = null;  
boolean empty = CollectionUtils.isEmpty(list);    // true(null 或 size == 0)  
boolean notEmpty = CollectionUtils.isNotEmpty(list); // false  
  
// 合并多个集合(返回新 List)  
List<String> merged = CollectionUtils.mergeArrayIntoCollection(arr, new ArrayList<>());

注意isEmptyMap 也适用!


3. ObjectUtils —— 通用对象工具

不止是 toString!还支持数组、相等性、默认值等。

// 安全转字符串,null 返回 "null"(不是空串!)  
String str = ObjectUtils.nullSafeToString(null); // "null"  
  
// 判断是否为数组(包括基本类型数组)  
boolean isArray = ObjectUtils.isArray(new int[]{1, 2}); // true  
  
// 安全 equals(避免 a.equals(b) 中 a 为 null)  
boolean eq = ObjectUtils.nullSafeEquals("a", "a"); // true  
  
// 获取默认值(若 obj 为 null)  
String name = ObjectUtils.getOrDefault(input, "default");

特别提醒nullSafeToString(null) 返回 "null" 字符串,不是 "",注意区分!


4. Assert —— 参数校验卫士

替代 if-throw,让契约更清晰。

public void saveUser(User user, String name) {  
    Assert.notNull(user, "用户对象不能为空");  
    Assert.hasText(name, "用户名不能为空或仅为空白");  
    Assert.isTrue(name.length() <= 20, "用户名长度不能超过20");  
}
  • 抛出 IllegalArgumentException,信息明确;
  • 支持 state(状态断言)、isTrueisArray 等多种校验。

适用场景:API 入参校验、Service 层前置条件检查。


二、IO / 资源相关工具类

5. FileCopyUtils —— 极简文件/流拷贝

底层基于 NIO,性能好,自动关闭流。

// 文件拷贝  
FileCopyUtils.copy(new File("src.txt"), new File("dest.txt"));  
  
// 流 → 字节数组  
byte[] data = FileCopyUtils.copyToByteArray(inputStream);  
  
// 字符串 → Writer(自动 flush)  
FileCopyUtils.copy("Hello", writer);

注意:所有方法均自动处理资源关闭,无需手动 try-with-resources。


6. StreamUtils —— 流操作助手

专为 InputStream/OutputStream 设计,支持编码控制。

// InputStream → String(指定编码)  
String text = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);  
  
// InputStream → byte[]  
byte[] bytes = StreamUtils.copyToByteArray(inputStream);  
  
// byte[] → OutputStream  
StreamUtils.copy(bytes, outputStream);

对比 FileCopyUtilsStreamUtils 更聚焦原始流操作,不涉及文件路径。


7. ResourceUtils —— 资源路径解析器

统一处理 classpath、file、jar 等协议路径。

// 获取 classpath 下资源的真实 File(仅适用于解压后的 classpath)  
File file = ResourceUtils.getFile("classpath:config/app.yml");  
  
// 获取 URL(适用于 jar 包内资源)  
URL url = ResourceUtils.getURL("classpath:static/logo.png");  
  
// 判断是否为文件 URL  
boolean isFile = ResourceUtils.isFileURL(url);

限制getFile() 在 jar 包中会抛异常!建议优先用 ResourceLoader + Resource 接口。


三、系统 / 反射相关

8. ReflectionUtils —— 反射简化器

自动处理 IllegalAccessException,无需 setAccessible(true) 手动调用。

// 查找字段(包括父类私有字段)  
Field nameField = ReflectionUtils.findField(User.class, "name");  
  
// 自动 makeAccessible 并获取值  
Object value = ReflectionUtils.getField(nameField, user);  
  
// 调用方法(支持私有方法)  
Method method = ReflectionUtils.findMethod(User.class, "init");  
ReflectionUtils.invokeMethod(method, user);

适用场景:ORM 框架、Bean 映射、动态代理内部实现。


9. AopProxyUtils —— AOP 代理真相探测器

绕过 JDK 动态代理或 CGLIB 代理,获取真实目标类。

// proxyObject 可能是 $Proxy0 或 User$$EnhancerBySpringCGLIB  
Class<?> targetClass = AopProxyUtils.ultimateTargetClass(proxyObject);  
// 返回原始 User.class

典型用途:日志打印类名、序列化时排除代理类、类型判断。


10. SystemPropertyUtils —— 系统属性占位符解析

支持 ${...} 占位符,类似 Spring 的 PropertyPlaceholder。

String path = SystemPropertyUtils.resolvePlaceholders("${user.home}/logs/app.log");  
// 结果如:/Users/john/logs/app.log

注意:仅解析系统属性(System.getProperty),不支持自定义属性源。


11. SerializationUtils —— 序列化与深拷贝

基于 Java 原生序列化,要求对象实现 Serializable

// 深拷贝(完全独立副本)  
User copy = SerializationUtils.clone(originalUser);  
  
// 序列化为字节数组  
byte[] data = SerializationUtils.serialize(originalUser);  
  
// 反序列化  
User restored = SerializationUtils.deserialize(data);

限制:依赖 Java 序列化机制,性能一般,仅适用于简单对象深拷贝。


四、编码 / 加密工具类

12. DigestUtils —— 摘要算法封装

无需引入 Apache Commons Codec,直接可用。

String md5 = DigestUtils.md5DigestAsHex("hello".getBytes());      // 32位小写  
String sha1 = DigestUtils.sha1DigestAsHex("hello".getBytes());    // 40位  
String sha256 = DigestUtils.sha256DigestAsHex("hello".getBytes()); // 64位

输出为十六进制小写字符串,适合密码哈希、文件校验等场景。


13. Base64Utils —— Base64 编解码

兼容 JDK 8+,但提供统一 API。

String encoded = Base64Utils.encodeToString("你好".getBytes(StandardCharsets.UTF_8));  
byte[] decoded = Base64Utils.decodeFromString(encoded);  
String original = new String(decoded, StandardCharsets.UTF_8);

推荐用于:Token 传输、图片内嵌、二进制数据文本化。


14. UriUtils —— URL 编解码专家

URLEncoder 更精准,专为 URI 设计。

// 编码查询参数(保留 /、? 等合法字符)  
String encoded = UriUtils.encodeQueryParam("张三/李四", StandardCharsets.UTF_8);  
// 结果:"%E5%BC%A0%E4%B8%89/%E6%9D%8E%E5%9B%9B"  
  
// 解码  
String decoded = UriUtils.decode(encoded, StandardCharsets.UTF_8);

关键区别URLEncoder 会把空格转成 +,而 UriUtils 转成 %20,符合 RFC 3986。


五、Web 相关工具类(来自 spring-web

15. WebUtils —— Web 层便捷工具

简化 Servlet API 的繁琐操作。

// 获取 Session(自动创建 or 不创建)  
HttpSession session = WebUtils.getSession(request, false);  
  
// 从请求中提取 Cookie  
Cookie tokenCookie = WebUtils.getCookie(request, "auth_token");  
  
// 获取请求体(仅限一次读取)  
String body = WebUtils.getRequestBody(request);

注意getRequestBody 会消费 InputStream,后续无法再读!


六、其他常用工具类

16. StopWatch —— 代码耗时统计器

支持多任务分段计时,输出格式化报告。

StopWatch sw = new StopWatch("用户服务初始化");  
sw.start("加载配置");  
loadConfig();  
sw.stop();  
  
sw.start("连接数据库");  
connectDB();  
sw.stop();  
  
System.out.println(sw.prettyPrint());

输出示例:

StopWatch '用户服务初始化': running time = 1250 ms  
---------------------------------------------  
ms         %     Task name  
600        48%   加载配置  
650        52%   连接数据库

适用场景:性能分析、启动耗时监控、方法执行时间对比。


17. AntPathMatcher —— Ant 风格路径匹配

支持 ?(单字符)、*(多字符)、**(多级目录)。

AntPathMatcher matcher = new AntPathMatcher();  
matcher.match("/api/**", "/api/user/123");       // true  
matcher.match("/api/*.html", "/api/index.html"); // true  
matcher.match("/api/?", "/api/a");               // true

广泛用于:Spring MVC 路由、Shiro/Sa-Token 权限路径匹配。


18. MimeTypeUtils —— MIME 类型处理

提供常用 MIME 常量 + 解析能力。

// 常用常量  
MediaType json = MimeTypeUtils.APPLICATION_JSON;  
MediaType xml = MimeTypeUtils.APPLICATION_XML;  
MediaType png = MimeTypeUtils.IMAGE_PNG;  
  
// 解析字符串  
MediaType type = MimeTypeUtils.parseMimeType("text/html;charset=utf-8");  
  
// 判断是否兼容  
boolean isJson = json.includes(MediaType.parseMediaType("application/json"));

典型用途:文件上传类型校验、Content-Type 设置、响应格式判断。


19. ClassUtils —— 类加载与检测工具

安全检测类是否存在,不触发初始化。

// 检测类是否在 classpath 中(不会初始化类!)  
boolean exists = ClassUtils.isPresent("com.mysql.cj.jdbc.Driver", cl);  
  
// 获取短类名(不含包)  
String shortName = ClassUtils.getShortName("com.example.User"); // "User"  
  
// 获取包名  
String pkg = ClassUtils.getPackageName(User.class); // "com.example"

适用场景:可选依赖检测(如数据库驱动)、日志打印优化。


20. NumberUtils —— 数字安全转换

支持泛型转换,自动处理格式异常。

// 安全解析数字  
int num = NumberUtils.parseNumber("123", Integer.class);  
double d = NumberUtils.parseNumber("3.14", Double.class);  
  
// 支持 Number 子类互转  
Long longVal = NumberUtils.convertNumberToTargetClass(123, Long.class);

Integer.parseInt 更安全:内部捕获 NumberFormatException 并抛出更友好的异常。


为什么要优先使用 Spring 内置工具类?

1. 零依赖成本

全部来自 spring-core(或 spring-web),只要用 Spring Boot 就天然可用。

2. 高健壮性

  • 空安全(null-safe)
  • 边界检查
  • 资源自动释放
  • 异常信息友好

3. 提升开发效率

一行代码替代 5~10 行样板逻辑,专注业务而非基础设施。

4. 统一团队规范

避免“每人一个 Util 类”的混乱局面,降低维护成本。


总结与建议

Spring 不仅是一个框架,更是一个成熟的开发基础设施库。上述 20+ 工具类,覆盖了日常开发 90% 的基础操作需求。

建议你:

    1. 遇到常见操作时,先查 Spring 是否已有工具类,而不是立刻自己写;
    1. 重构旧代码,用 StringUtils.hasText() 替代手写判空;
    1. 在团队 Code Review 中推广使用,形成统一规范;
    1. 结合 IDE 插件(如 Alibaba Java Coding Guidelines),自动提示可替换的工具方法。

真正的高效开发,不是写得更多,而是用得更巧。


关注我,持续分享 Spring 实战技巧、架构设计与性能优化干货!


原创内容,欢迎点赞、收藏、转发!