Spring Boot 内置工具类深度指南
一、字符串处理神器:StringUtils
Spring 提供的 StringUtils
相比 Apache Commons Lang 轻量且无缝集成 Spring 生态,解决高频字符串操作痛点:
java
// 判断字符串是否有实际内容(非空格字符)
boolean isValid = StringUtils.hasText(" "); // false
// 拼接集合元素(避免手动循环)
List<String> names = Arrays.asList("张三", "李四");
String result = StringUtils.collectionToDelimitedString(names, ","); // "张三,李四"
// 安全截断长字符串
String longText = "超长文本需截断显示";
String truncated = StringUtils.truncate(longText, 5); // "超长..."
避坑指南:
hasText()
比isEmpty()
更严格,会排除纯空格字符串- 频繁字符串拼接时,
arrayToDelimitedString()
性能 优于+
操作符
二、集合操作王牌:CollectionUtils
处理集合判空、过滤、合并时替代手写循环,提升代码可读性:
java
// 安全合并多个数据源(自动过滤空集合)
List<String> merged = Stream.of(list1, list2)
.filter(list -> !CollectionUtils.isEmpty(list)) // 过滤空集合
.flatMap(List::stream)
.collect(Collectors.toList());
// 查找首个匹配元素(避免NPE)
Integer firstMatch = CollectionUtils.findFirstMatch(
Arrays.asList(1, 2, 3),
Arrays.asList(3, 6)
); // 3
注意 :hasUniqueObject()
方法使用 ==
而非 equals()
比较对象,不推荐使用
三、资源与文件操作
1. ResourceUtils - 安全读取资源
java
// 读取 classpath 资源(兼容 jar 包)
File config = ResourceUtils.getFile("classpath:config.yml");
2. FileCopyUtils - 简化 I/O 操作
java
// 快速文件复制(自动关闭流)
FileCopyUtils.copy(inputStream, outputStream);
// 递归删除目录(替代 FileUtils)
FileSystemUtils.deleteRecursively(Paths.get("/tmp"));
四、反射与 Bean 工具
1. ReflectionUtils - 突破封装限制
java
// 单元测试中访问私有方法
Method privateMethod = ReflectionUtils.findMethod(
SecurityUtil.class, "internalEncrypt", String.class
);
ReflectionUtils.makeAccessible(privateMethod); // 解除私有限制
String result = (String) privateMethod.invoke(securityUtil, "data");
2. BeanUtils - DTO/Entity 转换
java
// 属性拷贝(自动类型转换)
OrderDTO dto = new OrderDTO("20230815001", new BigDecimal("99.99"));
OrderEntity entity = new OrderEntity();
BeanUtils.copyProperties(dto, entity); // BigDecimal → double 隐式转换
风险 :字段同名但类型不同时可能丢失精度,需业务校验
五、测试与校验工具
1. Assert - 防御式编程
java
// 参数校验(替代 if-throw)
public void processPayment(Long id, BigDecimal amount) {
Assert.notNull(id, "订单ID不能为空");
Assert.isTrue(amount.compareTo(BigDecimal.ZERO) > 0, "金额需 >0");
}
2. MockMvc - Controller 层测试
java
@SpringBootTest
@AutoConfigureMockMvc
class UserControllerTest {
@Test
void testGetUser() throws Exception {
mockMvc.perform(get("/users/1"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.name").value("张三"));
}
}
六、性能监控与进阶工具
1. StopWatch - 精准代码计时
java
StopWatch stopWatch = new StopWatch("API 性能监控");
stopWatch.start("数据库查询");
// SQL 操作...
stopWatch.stop();
stopWatch.start("数据转换");
// 转换逻辑...
stopWatch.stop();
System.out.println(stopWatch.prettyPrint());
输出示例:
markdown
StopWatch 'API 性能监控': running time = 1200 ms
-----------------------------------------
ms % Task name
-----------------------------------------
0800 67% 数据库查询
0400 33% 数据转换
2. SpEL 动态解析
java
// 运行时执行表达式
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("name.toUpperCase()");
String result = exp.getValue(user, String.class); // "JOHN"
总结:工具类最佳实践
场景 | 推荐工具类 | 优势 |
---|---|---|
字符串处理 | StringUtils |
轻量级、空白字符敏感 |
集合操作 | CollectionUtils |
链式操作、空集合安全 |
Bean 拷贝 | BeanUtils |
快速 DTO 转换 |
性能监控 | StopWatch |
多任务分段计时 |
反射操作 | ReflectionUtils |
安全访问私有成员 |
核心原则
- 避免重复造轮子 :优先使用 Spring 原生工具类(
org.springframework.util
包),无需额外依赖 - 谨慎使用反射 :生产代码慎用
ReflectionUtils
,优先考虑设计模式优化 - 类型转换风险 :
BeanUtils.copyProperties()
需注意字段类型兼容性,必要时手动校验 - 性能监控边界 :
StopWatch
适用于单机调试,分布式系统需用 SkyWalking 或 Prometheus
通过合理使用这些工具类,可减少 50% 的样板代码 ,显著提升代码健壮性。建议在 IDE 安装 Spring Assistant 插件,自动提示工具类方法。
原文:xuanhu.info/projects/it...