SpringBoot中内置的49个常用工具类
zhezhongyun 2025-07-24 23:17 21 浏览
SpringBoot以其强大的自动配置和丰富的生态系统成为Java开发的首选框架。除了核心功能外,SpringBoot及其依赖的Spring框架还包含大量实用工具类,它们可以显著简化日常开发工作。本文将介绍49个常用工具类,并通过简洁的代码示例展示它们的基本用法。
字符串处理工具类
1. StringUtils
import org.springframework.util.StringUtils;
// 检查字符串是否为空
boolean isEmpty = StringUtils.isEmpty(null); // true
boolean isEmpty2 = StringUtils.isEmpty(""); // true
// 检查字符串是否有文本内容
boolean hasText = StringUtils.hasText(" "); // false
boolean hasText2 = StringUtils.hasText("hello"); // true
// 分割字符串
String[] parts = StringUtils.tokenizeToStringArray("a,b,c", ",");
// 清除首尾空白
String trimmed = StringUtils.trimWhitespace(" hello "); // "hello"
2. AntPathMatcher
import org.springframework.util.AntPathMatcher;
AntPathMatcher matcher = new AntPathMatcher();
boolean match1 = matcher.match("/users/*", "/users/123"); // true
boolean match2 = matcher.match("/users/**", "/users/123/orders"); // true
boolean match3 = matcher.match("/user?", "/user1"); // true
// 提取路径变量
Map<String, String> vars = matcher.extractUriTemplateVariables(
"/users/{id}", "/users/42"); // {id=42}
3. PatternMatchUtils
import org.springframework.util.PatternMatchUtils;
boolean matches1 = PatternMatchUtils.simpleMatch("user*", "username"); // true
boolean matches2 = PatternMatchUtils.simpleMatch("user?", "user1"); // true
boolean matches3 = PatternMatchUtils.simpleMatch(
new String[]{"user*", "admin*"}, "username"); // true
4. PropertyPlaceholderHelper
import org.springframework.util.PropertyPlaceholderHelper;
PropertyPlaceholderHelper helper = new PropertyPlaceholderHelper("${", "}");
Properties props = new Properties();
props.setProperty("name", "World");
props.setProperty("greeting", "Hello ${name}!");
String result = helper.replacePlaceholders("${greeting}", props::getProperty);
// "Hello World!"
集合和数组工具类
5. CollectionUtils
import org.springframework.util.CollectionUtils;
// 检查集合是否为空
boolean isEmpty = CollectionUtils.isEmpty(null); // true
boolean isEmpty2 = CollectionUtils.isEmpty(Collections.emptyList()); // true
// 集合操作
List<String> list1 = Arrays.asList("a", "b", "c");
List<String> list2 = Arrays.asList("b", "c", "d");
Collection<String> intersection = CollectionUtils.intersection(list1, list2); // [b, c]
// 合并集合
List<String> target = new ArrayList<>();
CollectionUtils.mergeArrayIntoCollection(new String[]{"a", "b"}, target);
6. MultiValueMap
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
map.add("colors", "red");
map.add("colors", "blue");
map.add("sizes", "large");
List<String> colors = map.get("colors"); // [red, blue]
7. ConcurrentReferenceHashMap
import org.springframework.util.ConcurrentReferenceHashMap;
// 创建高并发场景下的引用Map (类似WeakHashMap但线程安全)
Map<String, Object> cache = new ConcurrentReferenceHashMap<>();
cache.put("key1", new LargeObject());
8. SystemPropertyUtils
import org.springframework.util.SystemPropertyUtils;
// 解析含系统属性的字符串
String javaHome = SystemPropertyUtils.resolvePlaceholders("${java.home}");
String pathWithDefault = SystemPropertyUtils.resolvePlaceholders(
"${unknown.property:default}"); // "default"
反射和类处理工具
9. ReflectionUtils
import org.springframework.util.ReflectionUtils;
// 获取类的字段
Field field = ReflectionUtils.findField(Person.class, "name");
ReflectionUtils.makeAccessible(field);
ReflectionUtils.setField(field, person, "John");
// 调用方法
Method method = ReflectionUtils.findMethod(Person.class, "setAge", int.class);
ReflectionUtils.makeAccessible(method);
ReflectionUtils.invokeMethod(method, person, 30);
// 字段回调
ReflectionUtils.doWithFields(Person.class, field -> {
System.out.println(field.getName());
});
10. ClassUtils
import org.springframework.util.ClassUtils;
// 获取类名
String shortName = ClassUtils.getShortName("org.example.MyClass"); // "MyClass"
// 检查类是否存在
boolean exists = ClassUtils.isPresent("java.util.List", null); // true
// 获取所有接口
Class<?>[] interfaces = ClassUtils.getAllInterfaces(ArrayList.class);
// 获取用户定义的类加载器
ClassLoader classLoader = ClassUtils.getDefaultClassLoader();
11. MethodInvoker
import org.springframework.util.MethodInvoker;
MethodInvoker invoker = new MethodInvoker();
invoker.setTargetObject(new MyService());
invoker.setTargetMethod("calculateTotal");
invoker.setArguments(new Object[]{100, 0.2});
invoker.prepare();
Object result = invoker.invoke();
12. BeanUtils
import org.springframework.beans.BeanUtils;
// 复制属性
Person source = new Person("John", 30);
Person target = new Person();
BeanUtils.copyProperties(source, target);
// 实例化类
Person newPerson = BeanUtils.instantiateClass(Person.class);
// 查找方法
Method method = BeanUtils.findMethod(Person.class, "setName", String.class);
I/O和资源工具
13. FileCopyUtils
import org.springframework.util.FileCopyUtils;
// 复制文件内容
byte[] bytes = FileCopyUtils.copyToByteArray(new File("input.txt"));
FileCopyUtils.copy(bytes, new File("output.txt"));
// 读取文本
String content = FileCopyUtils.copyToString(
new InputStreamReader(new FileInputStream("input.txt"), "UTF-8"));
// 流复制
FileCopyUtils.copy(inputStream, outputStream);
14. ResourceUtils
import org.springframework.util.ResourceUtils;
// 获取文件
File file = ResourceUtils.getFile("classpath:config.properties");
// 检查是否是URL
boolean isUrl = ResourceUtils.isUrl("http://example.com");
// 获取URL
URL url = ResourceUtils.getURL("classpath:data.json");
15. StreamUtils
import org.springframework.util.StreamUtils;
// 流操作
byte[] data = StreamUtils.copyToByteArray(inputStream);
String text = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
StreamUtils.copy(inputStream, outputStream);
StreamUtils.copy("Hello", StandardCharsets.UTF_8, outputStream);
16. FileSystemUtils
import org.springframework.util.FileSystemUtils;
// 删除目录
boolean deleted = FileSystemUtils.deleteRecursively(new File("/tmp/test"));
// 复制目录
FileSystemUtils.copyRecursively(new File("source"), new File("target"));
17. ResourcePatternUtils
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.ResourcePatternUtils;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
// 获取匹配资源
Resource[] resources = ResourcePatternUtils.getResourcePatternResolver(
new PathMatchingResourcePatternResolver())
.getResources("classpath*:META-INF/*.xml");
Web相关工具类
18. WebUtils
import org.springframework.web.util.WebUtils;
import javax.servlet.http.HttpServletRequest;
// 获取Cookie
Cookie cookie = WebUtils.getCookie(request, "sessionId");
// 获取请求路径
String path = WebUtils.getLookupPathForRequest(request);
// 从请求中获取参数
int pageSize = WebUtils.getIntParameter(request, "pageSize", 10);
19. UriUtils
import org.springframework.web.util.UriUtils;
// 编解码URI组件
String encoded = UriUtils.encodePathSegment("path with spaces", "UTF-8");
String decoded = UriUtils.decode(encoded, "UTF-8");
20. UriComponentsBuilder
import org.springframework.web.util.UriComponentsBuilder;
// 构建URI
URI uri = UriComponentsBuilder.fromHttpUrl("http://example.com")
.path("/products")
.queryParam("category", "books")
.queryParam("sort", "price")
.build()
.toUri();
21. ContentCachingRequestWrapper
import org.springframework.web.util.ContentCachingRequestWrapper;
import javax.servlet.http.HttpServletRequest;
ContentCachingRequestWrapper wrapper = new ContentCachingRequestWrapper(request);
// 请求处理后
byte[] body = wrapper.getContentAsByteArray();
22. HtmlUtils
import org.springframework.web.util.HtmlUtils;
// HTML转义
String escaped = HtmlUtils.htmlEscape("<script>alert('XSS')</script>");
// <script>alert('XSS')</script>
// HTML反转义
String unescaped = HtmlUtils.htmlUnescape("<b>Bold</b>");
// <b>Bold</b>
验证和断言工具
23. Assert
import org.springframework.util.Assert;
// 常用断言
Assert.notNull(object, "Object must not be null");
Assert.hasText(name, "Name must not be empty");
Assert.isTrue(amount > 0, "Amount must be positive");
Assert.notEmpty(items, "Items must not be empty");
Assert.state(isInitialized, "Service is not initialized");
24. ObjectUtils
import org.springframework.util.ObjectUtils;
// 对象工具
boolean isEmpty = ObjectUtils.isEmpty(null); // true
boolean isEmpty2 = ObjectUtils.isEmpty(new String[0]); // true
String nullSafe = ObjectUtils.nullSafeToString(null); // "null"
boolean equals = ObjectUtils.nullSafeEquals(obj1, obj2);
// 默认值
String value = ObjectUtils.getOrDefault(null, "default");
25. NumberUtils
import org.springframework.util.NumberUtils;
// 数字转换
Integer parsed = NumberUtils.parseNumber("42", Integer.class);
Double converted = NumberUtils.convertNumberToTargetClass(42, Double.class);
日期和时间工具
26. DateTimeUtils
import org.springframework.format.datetime.DateTimeFormatUtils;
import java.util.Date;
// 格式化日期
String formatted = DateTimeFormatUtils.getDateTimeInstance().format(new Date());
27. StopWatch
import org.springframework.util.StopWatch;
// 计时工具
StopWatch watch = new StopWatch("TaskName");
watch.start("phase1");
// 执行任务1
Thread.sleep(100);
watch.stop();
watch.start("phase2");
// 执行任务2
Thread.sleep(200);
watch.stop();
// 输出报告
System.out.println(watch.prettyPrint());
System.out.println("Total time: " + watch.getTotalTimeMillis() + "ms");
安全相关工具
28. DigestUtils
import org.springframework.util.DigestUtils;
// MD5哈希
String md5 = DigestUtils.md5DigestAsHex("password".getBytes());
// 文件MD5
String fileMd5;
try (InputStream is = new FileInputStream("file.txt")) {
fileMd5 = DigestUtils.md5DigestAsHex(is);
}
29. Base64Utils
import org.springframework.util.Base64Utils;
// Base64编解码
byte[] data = "Hello World".getBytes();
String encoded = Base64Utils.encodeToString(data);
byte[] decoded = Base64Utils.decodeFromString(encoded);
30. CryptoUtils
import org.springframework.security.crypto.encrypt.Encryptors;
import org.springframework.security.crypto.encrypt.TextEncryptor;
// 文本加密
String password = "secret";
String salt = "deadbeef";
TextEncryptor encryptor = Encryptors.text(password, salt);
String encrypted = encryptor.encrypt("Message");
String decrypted = encryptor.decrypt(encrypted);
JSON和数据转换工具
31. JsonUtils
import org.springframework.boot.json.JsonParser;
import org.springframework.boot.json.JsonParserFactory;
// JSON解析
JsonParser parser = JsonParserFactory.getJsonParser();
Map<String, Object> parsed = parser.parseMap("{"name":"John", "age":30}");
List<Object> parsedList = parser.parseList("[1, 2, 3]");
32. TypeUtils
import org.springframework.core.ResolvableType;
// 类型解析
ResolvableType type = ResolvableType.forClass(List.class);
ResolvableType elementType = type.getGeneric(0);
// 泛型类型处理
ResolvableType mapType = ResolvableType.forClassWithGenerics(
Map.class, String.class, Integer.class);
33. MappingJackson2HttpMessageConverter
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import com.fasterxml.jackson.databind.ObjectMapper;
// 自定义JSON转换器
ObjectMapper mapper = new ObjectMapper();
// 配置mapper
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(mapper);
其他实用工具
34. RandomStringUtils
import org.apache.commons.lang3.RandomStringUtils;
// 随机字符串生成
String random = RandomStringUtils.randomAlphanumeric(10);
String randomLetters = RandomStringUtils.randomAlphabetic(8);
String randomNumeric = RandomStringUtils.randomNumeric(6);
35. CompletableFutureUtils
import java.util.concurrent.CompletableFuture;
import java.util.List;
import java.util.stream.Collectors;
// 合并多个CompletableFuture结果
List<CompletableFuture<String>> futures = /* 多个异步操作 */;
CompletableFuture<List<String>> allResults = CompletableFuture.allOf(
futures.toArray(new CompletableFuture[0]))
.thenApply(v -> futures.stream()
.map(CompletableFuture::join)
.collect(Collectors.toList()));
36. CacheControl
import org.springframework.http.CacheControl;
import java.util.concurrent.TimeUnit;
// 缓存控制
CacheControl cacheControl = CacheControl.maxAge(1, TimeUnit.HOURS)
.noTransform()
.mustRevalidate();
String headerValue = cacheControl.getHeaderValue();
37. AnnotationUtils
import org.springframework.core.annotation.AnnotationUtils;
// 查找注解
Component annotation = AnnotationUtils.findAnnotation(MyClass.class, Component.class);
// 获取注解属性
String value = AnnotationUtils.getValue(annotation, "value").toString();
// 合并注解
Component mergedAnnotation = AnnotationUtils.synthesizeAnnotation(
annotation, MyClass.class);
38. DefaultConversionService
import org.springframework.core.convert.support.DefaultConversionService;
// 类型转换
DefaultConversionService conversionService = new DefaultConversionService();
String strValue = "42";
Integer intValue = conversionService.convert(strValue, Integer.class);
39. HeaderUtils
import org.springframework.http.HttpHeaders;
// HTTP头处理
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");
headers.setContentLength(1024);
headers.setCacheControl("max-age=3600");
40. MediaTypeFactory
import org.springframework.http.MediaType;
import org.springframework.http.MediaTypeFactory;
import java.util.Optional;
// 根据文件名推断媒体类型
Optional<MediaType> mediaType = MediaTypeFactory.getMediaType("document.pdf");
// application/pdf
41. MimeTypeUtils
import org.springframework.util.MimeTypeUtils;
// MIME类型常量和解析
boolean isCompatible = MimeTypeUtils.APPLICATION_JSON.isCompatibleWith(
MimeTypeUtils.APPLICATION_JSON_UTF8);
42. WebClientUtils
import org.springframework.web.reactive.function.client.WebClient;
import org.springframework.web.reactive.function.client.ExchangeFilterFunction;
// 创建WebClient
WebClient webClient = WebClient.builder()
.baseUrl("https://api.example.com")
.defaultHeader("Authorization", "Bearer token")
.filter(ExchangeFilterFunction.ofRequestProcessor(
clientRequest -> {
// 请求处理
return Mono.just(clientRequest);
}))
.build();
43. PropertySourceUtils
import org.springframework.core.env.PropertySource;
import org.springframework.core.env.StandardEnvironment;
// 添加属性源
StandardEnvironment env = new StandardEnvironment();
Map<String, Object> map = new HashMap<>();
map.put("app.name", "MyApp");
env.getPropertySources().addFirst(new MapPropertySource("my-properties", map));
44. EventPublishingUtils
import org.springframework.context.ApplicationEventPublisher;
// 发布事件
ApplicationEventPublisher publisher = /* 获取发布器 */;
publisher.publishEvent(new CustomEvent("Something happened"));
45. LocaleContextHolder
import org.springframework.context.i18n.LocaleContextHolder;
import java.util.Locale;
// 获取/设置当前语言环境
Locale currentLocale = LocaleContextHolder.getLocale();
LocaleContextHolder.setLocale(Locale.FRENCH);
46. AopUtils
import org.springframework.aop.support.AopUtils;
// AOP工具方法
boolean isAopProxy = AopUtils.isAopProxy(bean);
boolean isCglibProxy = AopUtils.isCglibProxy(bean);
Class<?> targetClass = AopUtils.getTargetClass(bean);
47. ProxyUtils
import org.springframework.aop.framework.ProxyFactory;
// 创建代理
ProxyFactory factory = new ProxyFactory(targetObject);
factory.addInterface(MyInterface.class);
factory.addAdvice(new MyMethodInterceptor());
MyInterface proxy = (MyInterface) factory.getProxy();
48. ClassPathScanningCandidateComponentProvider
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
// 扫描类路径
ClassPathScanningCandidateComponentProvider scanner =
new ClassPathScanningCandidateComponentProvider(true);
scanner.addIncludeFilter(new AnnotationTypeFilter(Component.class));
Set<BeanDefinition> beans = scanner.findCandidateComponents("org.example");
49. YamlUtils
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.core.io.ClassPathResource;
// 解析YAML文件
YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
yaml.setResources(new ClassPathResource("application.yml"));
Properties properties = yaml.getObject();
总结
这些工具类涵盖了Java开发中的大部分常见场景,从基础的字符串处理到高级的反射操作,从文件IO到安全加密,从Web开发到性能监控。熟练掌握这些工具类可以显著提高开发效率,减少样板代码,并帮助编写更健壮的应用程序。
在日常开发中,建议养成查看Spring和SpringBoot文档的习惯,挖掘更多有用的工具类。
相关推荐
- Opinion丨Struggle Against U.S. Mind colonization in the Global South
-
Editor'snote:Thismonth,XinhuaNewsAgency'sThinkTankreleasedareporttitled"Colonizationof...
- 爱可可AI论文推介(2020.11.4)_爱可可女装旗舰店
-
LG-机器学习CV-计算机视觉CL-计算与语言AS-音频与语音RO-机器人(*表示值得重点关注)1、[LG]*CombiningLabelPropagationan...
- 何新:罗马伪史考英文版序言_罗马史学
-
2019-10-2514:48:27何新:罗马伪史考序言(英文译本)HeXin:PreambleofResearchonPseudo-historyofRome1Afewyear...
- XPeng Stock Rises Over 4% after Q2 Revenue and EV Margin Set Records
-
TMTPOST--TheAmericandepositaryreceipts(ADRs)ofXPengInc.rosearound4.2%onTuesdayaftert...
- 英汉世界语部首(八)_英文部首字典
-
本节讲八个部首,分别是:弓gōng【ECWLrad】bow廾gǒng【ECWLrad】twen广guǎng【ECWLrad】vast己jǐ【ECWLrad】self已yǐ...
- 一课译词:划水_划水是什么地方的方言
-
[Photo/SIPA]懒惰是人类的天性,因此才总有人会在工作时“划水”。“划水【huáshuǐ】”,本意是指“用胳膊划的动作(makestrokeswithone’sarms)”,延伸为“...
- 首测!GPT-4o做Code Review可行吗?
-
编辑|言征出品|51CTO技术栈(微信号:blog51cto)近日,OpenAI一记重拳,推出了GPT-4o(“o”表示“omni”),将语音识别和对话方面的优势展示的淋漓尽致。几乎可以肯定,...
- C++|漫谈STL细节及内部原理_c++ stl详解
-
1988年,AlexanderStepanov开始进入惠普的PaloAlto实验室工作,在随后的4年中,他从事的是有关磁盘驱动器方面的工作。直到1992年,由于参加并主持了实验室主任BillWo...
- C++ inline关键字深度解析:不止于优化的头文件定义许可
-
在C++开发中,几乎每个程序员都用过inline关键字,但多数人只停留在“内联优化”的表层理解。事实上,inline的真正威力在于它打破了C++的单一定义规则(ODR)限制,成为头文件中安全定义函数的...
- 实用 | 10分钟教你搭建一个嵌入式web服务器
-
之前分享的文章中提到了几种可以在嵌入式中使用的web服务器。嵌入式web服务器就是把web服务器移植到嵌入式系统的服务器。它仍然是基于http文本协议进行通信的,具有标准的接口形式,对客户端...
- 中间语言格式_中间格式文本是什么
-
在通常情况下,编译器会将目标语言转换成某种中间语言格式,而不是直接将源代码转换成二进制机器指令,不少c语言编译器,都会将代码编译成汇编语言,然后再通过汇编语言编译器将汇编代码转换成目标机器可执行的二进...
- 一线开发大牛带你深度解析探讨模板解释器,解释器的生成
-
解释器生成解释器的机器代码片段都是在TemplateInterpreterGenerator::generate_all()中生成的,下面将分小节详细展示该函数的具体细节,以及解释器某个组件的机器代码...
- 干货,Web开发和前端开发逆天工具大全
-
微信ID:WEB_wysj(点击关注)◎◎◎◎◎◎◎◎◎一┳═┻︻▄(点击页底“阅读原文”前往下载)●●●逆天工具CDN资源库国内Bootstrap中文网开源项目免费CDN服务36...
- 移动端rem+vw适配_移动端web页面适配方案
-
rem:rem是相对单位,设置根元素html的font-size,比如给html设置字体大小为100px,1rem=100px;rem缺点:1.和根元素font-size值强耦合,系统字...
- 从零搭建 React 开发 H5 模板_react html5
-
项目创建创建项目文件夹mkdir react-democd react-demonpm init -y依赖安装yarn add rea...
- 一周热门
- 最近发表
-
- Opinion丨Struggle Against U.S. Mind colonization in the Global South
- 爱可可AI论文推介(2020.11.4)_爱可可女装旗舰店
- 何新:罗马伪史考英文版序言_罗马史学
- XPeng Stock Rises Over 4% after Q2 Revenue and EV Margin Set Records
- 英汉世界语部首(八)_英文部首字典
- 一课译词:划水_划水是什么地方的方言
- 首测!GPT-4o做Code Review可行吗?
- C++|漫谈STL细节及内部原理_c++ stl详解
- C++ inline关键字深度解析:不止于优化的头文件定义许可
- 实用 | 10分钟教你搭建一个嵌入式web服务器
- 标签列表
-
- HTML 教程 (33)
- HTML 简介 (35)
- HTML 实例/测验 (32)
- HTML 测验 (32)
- JavaScript 和 HTML DOM 参考手册 (32)
- HTML 拓展阅读 (30)
- HTML文本框样式 (31)
- HTML滚动条样式 (34)
- HTML5 浏览器支持 (33)
- HTML5 新元素 (33)
- HTML5 WebSocket (30)
- HTML5 代码规范 (32)
- HTML5 标签 (717)
- HTML5 标签 (已废弃) (75)
- HTML5电子书 (32)
- HTML5开发工具 (34)
- HTML5小游戏源码 (34)
- HTML5模板下载 (30)
- HTTP 状态消息 (33)
- HTTP 方法:GET 对比 POST (33)
- 键盘快捷键 (35)
- 标签 (226)
- HTML button formtarget 属性 (30)
- opacity 属性 (32)
- transition 属性 (33)