⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 风象南 「风象南」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言都将得到认真回复。甚至不知道如何读源码也可以请教噢。
  4. 新的源码解析文章实时收到通知。每周更新一篇左右。
  5. 认真的源码交流微信群。

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>");
// &lt;script&gt;alert('XSS')&lt;/script&gt;

// HTML反转义
String unescaped = HtmlUtils.htmlUnescape("&lt;b&gt;Bold&lt;/b&gt;");
// <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 java.util.Date;

// 格式化日期
String formatted = DateFormat.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文档的习惯,挖掘更多有用的工具类。

文章目录
  1. 1. 字符串处理工具类
    1. 1.0.0.1. 1. StringUtils
    2. 1.0.0.2. 2. AntPathMatcher
    3. 1.0.0.3. 3. PatternMatchUtils
    4. 1.0.0.4. 4. PropertyPlaceholderHelper
  • 2. 集合和数组工具类
    1. 2.0.0.1. 5. CollectionUtils
    2. 2.0.0.2. 6. MultiValueMap
    3. 2.0.0.3. 7. ConcurrentReferenceHashMap
    4. 2.0.0.4. 8. SystemPropertyUtils
  • 3. 反射和类处理工具
    1. 3.0.0.1. 9. ReflectionUtils
    2. 3.0.0.2. 10. ClassUtils
    3. 3.0.0.3. 11. MethodInvoker
    4. 3.0.0.4. 12. BeanUtils
  • 4. I/O和资源工具
    1. 4.0.0.1. 13. FileCopyUtils
    2. 4.0.0.2. 14. ResourceUtils
    3. 4.0.0.3. 15. StreamUtils
    4. 4.0.0.4. 16. FileSystemUtils
    5. 4.0.0.5. 17. ResourcePatternUtils
  • 5. Web相关工具类
    1. 5.0.0.1. 18. WebUtils
    2. 5.0.0.2. 19. UriUtils
    3. 5.0.0.3. 20. UriComponentsBuilder
    4. 5.0.0.4. 21. ContentCachingRequestWrapper
    5. 5.0.0.5. 22. HtmlUtils
  • 6. 验证和断言工具
    1. 6.0.0.1. 23. Assert
    2. 6.0.0.2. 24. ObjectUtils
    3. 6.0.0.3. 25. NumberUtils
  • 7. 日期和时间工具
    1. 7.0.0.1. 26. DateTimeUtils
    2. 7.0.0.2. 27. StopWatch
  • 8. 安全相关工具
    1. 8.0.0.1. 28. DigestUtils
    2. 8.0.0.2. 29. Base64Utils
    3. 8.0.0.3. 30. CryptoUtils
  • 9. JSON和数据转换工具
    1. 9.0.0.1. 31. JsonUtils
    2. 9.0.0.2. 32. TypeUtils
    3. 9.0.0.3. 33. MappingJackson2HttpMessageConverter
  • 10. 其他实用工具
    1. 10.0.0.1. 34. RandomStringUtils
    2. 10.0.0.2. 35. CompletableFutureUtils
    3. 10.0.0.3. 36. CacheControl
    4. 10.0.0.4. 37. AnnotationUtils
    5. 10.0.0.5. 38. DefaultConversionService
    6. 10.0.0.6. 39. HeaderUtils
    7. 10.0.0.7. 40. MediaTypeFactory
    8. 10.0.0.8. 41. MimeTypeUtils
    9. 10.0.0.9. 42. WebClientUtils
    10. 10.0.0.10. 43. PropertySourceUtils
    11. 10.0.0.11. 44. EventPublishingUtils
    12. 10.0.0.12. 45. LocaleContextHolder
    13. 10.0.0.13. 46. AopUtils
    14. 10.0.0.14. 47. ProxyUtils
    15. 10.0.0.15. 48. ClassPathScanningCandidateComponentProvider
    16. 10.0.0.16. 49. YamlUtils
  • 11. 总结