Spring常用工具类
一、工具类
内置工具类一般位于org.springframework.util
下,另外可以一个工具类org.apache.commons
适合程序员,不过需要引入依赖
1 | <dependency> |
1、断言
-
断言是一个逻辑判断,用于检查不应该发生的情况
-
Assert 关键字在 JDK1.4 中引入,可通过 JVM 参数
-enableassertions
开启 -
SpringBoot 中提供了 Assert 断言工具类,通常用于数据合法性检查
1 | // 要求参数 object 必须为非空(Not Null),否则抛出异常,不予放行 |
2、对象、数组、集合
2.1 Collections/Lists/Objects
1 | /**===========Collections==================*/ |
2.2 ObjectUtils
- 获取对象的基本信息
1 | // 获取对象的类名。参数为 null 时,返回字符串:"null" |
- 判断工具
1 | // 判断数组是否为空 |
- 其他工具方法
1 | // 向参数数组的末尾追加新元素,并返回一个新数组 |
2.3 StringUtils
- 字符串判断工具
1 | // 判断字符串是否为 null,或 ""。注意,包含空白符的字符串为非空 |
- 字符串操作工具
1 | // 查找并替换指定子串 |
- 路径相关工具方法
1 | // 解析路径字符串,优化其中的 “..” |
2.4 CollectionUtils
- 集合判断工具
1 | // 判断 List/Set 是否为空 |
- 集合操作工具
1 | // 将 Array 中的元素都添加到 List/Set 中 |
2.5 BooleanUtils
- 布尔判断工具(无须判空了)
1 | // 判断某个参数的值是true或false |
3、文件、资源、IO 流
3.1 IOUtils(常用)
1 | // 读取文件,读取某个txt文件中的数据 |
1 | // 读取文件,读取某个txt文件中的数据 |
3.2 FileCopyUtils
- 输入
1 | // 从文件中读入到字节数组中 |
- 输出
1 | // 从字节数组到文件 |
3.3 ResourceUtils
- 从资源路径获取文件
1 | // 判断字符串是否是一个合法的 URL 字符串。 |
- Resource
1 | // 文件系统资源 D:... |
3.4 StreamUtils
- 输入
1 | void copy(byte[] in, OutputStream out) |
- 输出
1 | byte[] copyToByteArray(InputStream in) |
4、反射、AOP
4.1 ReflectionUtils
- 获取方法
1 | // 在类中查找指定方法 |
- 执行方法
1 | // 执行方法 |
- 获取字段
1 | // 在类中查找指定属性 |
- 设置字段
1 | // 获取 target 对象的 field 属性值 |
4.2 AopUtils
- 判断代理类型
1 | // 判断是不是 Spring 代理对象 |
- 获取被代理对象的 class
1 | // 获取被代理的目标 class |
4.3 AopContext
- 获取当前对象的代理对象
1 | Object currentProxy() |
4.4 AOP举例
- 演示对象
1 | package com.zstu.student; |
- 反射举例
1 | System.out.println("---------- findMethod ----------"); |
4.5 ClassUtils(常用)
spring的org.springframework.util
包下的ClassUtils
类
1 | // 获取对象的所有接口 |
4.6 BeanUtils(常用)
1 | // 拷贝对象的属性 |
5、编解码、字符编码
5.1 Base64Utils
直接使用org.springframework.util
包下的Base64Utils
工具类,里面包含encode
和decode
方法,用于对数据进行加密和解密
1 | String str = "abc"; |
5.2 StandardCharsets
我们在做字符转换的时候,经常需要指定字符编码,比如:UTF-8、ISO-8859-1等等。这时就可以直接使用java.nio.charset
包下的StandardCharsets
类中静态变量。
1 | String str = "abc"; |
5.3 DigestUtils
对数据进行加密处理,比如:md5或sha256,可以使用apache的org.apache.commons.codec.digest
包下的DigestUtils
类
1 | // md5加密 |
5.4 SerializationUtils
数据进行序列化
和反序列化
处理。传统的做法是某个类实现Serializable
接口,然后重新它的writeObject
和readObject
方法。使用org.springframework.util
包下的SerializationUtils
工具类,能更轻松实现序列化和反序列化功能。
1 | Map<String, String> map = Maps.newHashMap(); |
6、日志与网络
6.1 MDC
MDC
是org.slf4j
包下的一个类,它的全称是Mapped Diagnostic Context,我们可以认为它是一个线程安全的存放诊断日志的容器。MDC的底层是用了ThreadLocal
来保存数据的,我们可以用它传递参数。
例如现在有这样一种场景:我们使用RestTemplate
调用远程接口时,有时需要在header
中传递信息,比如:traceId,source等,便于在查询日志时能够串联一次完整的请求链路,快速定位问题。这种业务场景就能通过ClientHttpRequestInterceptor
接口实现,具体做法如下:第一步,定义一个LogFilter拦截所有接口请求,在MDC中设置traceId:
1 | public class LogFilter implements Filter { |
第二步,实现ClientHttpRequestInterceptor
接口,MDC中获取当前请求的traceId,然后设置到header中:
1 | public class RestTemplateInterceptor implements ClientHttpRequestInterceptor { |
第三步,定义配置类,配置上面定义的RestTemplateInterceptor
类:
1 |
|
其中MdcUtil其实是利用MDC工具在ThreadLocal中存储和获取traceId
1 | public class MdcUtil { |
当然,这个例子中没有演示MdcUtil类的add方法具体调的地方,我们可以在filter中执行接口方法之前,生成traceId,调用MdcUtil类的add方法添加到MDC中,然后在同一个请求的其他地方就能通过MdcUtil类的get方法获取到该traceId。
能使用MDC保存traceId等参数的根本原因是,用户请求到应用服务器,Tomcat会从线程池中分配一个线程去处理该请求。那么该请求的整个过程中,保存到MDC的ThreadLocal中的参数,也是该线程独享的,所以不会有线程安全问题。
6.2 HttpStatus
org.springframework.http
包下的HttpStatus枚举,或者org.apache.http
包下的HttpStatus
接口,已经把常用的http返回码给我们定义好了,直接拿来用就可以了
二、第三方工具类
这里推荐的第三方工具类是Hutool工具类,里面工具包十分全面,官方网址https://hutool.cn/docs/#/
参考转载文章:
https://juejin.cn/post/7043403364020781064#heading-10