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<>());
注意:isEmpty 对 Map 也适用!
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(状态断言)、isTrue、isArray等多种校验。
适用场景: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);
对比 FileCopyUtils:StreamUtils 更聚焦原始流操作,不涉及文件路径。
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% 的基础操作需求。
建议你:
-
- 遇到常见操作时,先查 Spring 是否已有工具类,而不是立刻自己写;
-
- 重构旧代码,用
StringUtils.hasText()替代手写判空;
- 重构旧代码,用
-
- 在团队 Code Review 中推广使用,形成统一规范;
-
- 结合 IDE 插件(如 Alibaba Java Coding Guidelines),自动提示可替换的工具方法。
真正的高效开发,不是写得更多,而是用得更巧。
关注我,持续分享 Spring 实战技巧、架构设计与性能优化干货!
原创内容,欢迎点赞、收藏、转发!