SpringBoot中內(nèi)置的49個常用工具類使用
SpringBoot以其強大的自動配置和豐富的生態(tài)系統(tǒng)成為Java開發(fā)的首選框架。
除了核心功能外,SpringBoot及其依賴的Spring框架還包含大量實用工具類,它們可以顯著簡化日常開發(fā)工作。
本文將介紹49個常用工具類,并通過簡潔的代碼示例展示它們的基本用法。
字符串處理工具類
1. StringUtils
import org.springframework.util.StringUtils;
// 檢查字符串是否為空
boolean isEmpty = StringUtils.isEmpty(null); // true
boolean isEmpty2 = StringUtils.isEmpty(""); // true
// 檢查字符串是否有文本內(nèi)容
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"); // true4. 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!"集合和數(shù)組工具類
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;
// 創(chuàng)建高并發(fā)場景下的引用Map (類似WeakHashMap但線程安全)
Map<String, Object> cache = new ConcurrentReferenceHashMap<>();
cache.put("key1", new LargeObject());8. SystemPropertyUtils
import org.springframework.util.SystemPropertyUtils;
// 解析含系統(tǒng)屬性的字符串
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");
// 調(diào)用方法
Method method = ReflectionUtils.findMethod(Person.class, "setAge", int.class);
ReflectionUtils.makeAccessible(method);
ReflectionUtils.invokeMethod(method, person, 30);
// 字段回調(diào)
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;
// 復(fù)制屬性
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;
// 復(fù)制文件內(nèi)容
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"));
// 流復(fù)制
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"));
// 復(fù)制目錄
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相關(guān)工具類
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); // 從請求中獲取參數(shù) 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;
// 構(gòu)建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轉(zhuǎn)義
String escaped = HtmlUtils.htmlEscape("<script>alert('XSS')</script>");
// <script>alert('XSS')</script>
// HTML反轉(zhuǎn)義
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); // 默認(rèn)值 String value = ObjectUtils.getOrDefault(null, "default");
25. NumberUtils
import org.springframework.util.NumberUtils;
// 數(shù)字轉(zhuǎn)換
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");
// 執(zhí)行任務(wù)1
Thread.sleep(100);
watch.stop();
watch.start("phase2");
// 執(zhí)行任務(wù)2
Thread.sleep(200);
watch.stop();
// 輸出報告
System.out.println(watch.prettyPrint());
System.out.println("Total time: " + watch.getTotalTimeMillis() + "ms");安全相關(guān)工具
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和數(shù)據(jù)轉(zhuǎn)換工具
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轉(zhuǎn)換器 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結(jié)果
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; // 類型轉(zhuǎn)換 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;
// 根據(jù)文件名推斷媒體類型
Optional<MediaType> mediaType = MediaTypeFactory.getMediaType("document.pdf");
// application/pdf41. 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;
// 創(chuàng)建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;
// 發(fā)布事件
ApplicationEventPublisher publisher = /* 獲取發(fā)布器 */;
publisher.publishEvent(new CustomEvent("Something happened"));45. LocaleContextHolder
import org.springframework.context.i18n.LocaleContextHolder; import java.util.Locale; // 獲取/設(shè)置當(dāng)前語言環(huán)境 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; // 創(chuàng)建代理 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();總結(jié)
這些工具類涵蓋了Java開發(fā)中的大部分常見場景,從基礎(chǔ)的字符串處理到高級的反射操作,從文件IO到安全加密,從Web開發(fā)到性能監(jiān)控。
熟練掌握這些工具類可以顯著提高開發(fā)效率,減少樣板代碼,并幫助編寫更健壯的應(yīng)用程序。
在日常開發(fā)中,建議養(yǎng)成查看Spring和SpringBoot文檔的習(xí)慣,挖掘更多有用的工具類。
以上就是SpringBoot中內(nèi)置的49個常用工具類使用的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot內(nèi)置工具類的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java的非阻塞隊列ConcurrentLinkedQueue解讀
這篇文章主要介紹了Java的非阻塞隊列ConcurrentLinkedQueue解讀,在并發(fā)編程中,有時候需要使用線程安全的隊列,如果要實現(xiàn)一個線程安全的隊列有兩種方式:一種是使用阻塞算法,另一種是使用非阻塞算法,需要的朋友可以參考下2023-12-12
springboot + vue 實現(xiàn)遞歸生成多級菜單(實例代碼)
這篇文章主要介紹了springboot + vue 實現(xiàn)遞歸生成多級菜單,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-12-12
基于SpringBoot整合oauth2實現(xiàn)token認(rèn)證
這篇文章主要介紹了基于SpringBoot整合oauth2實現(xiàn)token 認(rèn)證,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-01-01
java可變參數(shù)(不定向參數(shù))的作用與實例
這篇文章主要給大家介紹了關(guān)于java可變參數(shù)(不定向參數(shù))的作用與實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
解決"XML Parser Error on line 1: 前言中不允許有內(nèi)容"錯誤
解決用windows自帶的記事編輯xml文件后出現(xiàn) "XML Parser Error on line 1: 前言中不允許有內(nèi)容。"的錯誤2018-02-02
Java synchronized關(guān)鍵_動力節(jié)點Java學(xué)院整理
在java中,每一個對象有且僅有一個同步鎖。這也意味著,同步鎖是依賴于對象而存在。下面通過本文給大家介紹synchronized原理 及基本規(guī)則,感興趣的朋友一起學(xué)習(xí)吧2017-05-05

