# 01-Spring Util
# 1.id生成器
org.springframework.util.IdGenerator接口,spring提供3个实现
- JdkIdGenerator 调用JDK底层UUID.randomUUID()方法
- AlternativeJdkIdGenerator 性能更高,远高于JDK的算法
- SimpleIdGenerator 类似于自增的Id生成器。每调用一次,自增1
JdkIdGenerator jdkIdGenerator = new JdkIdGenerator();
System.out.println(jdkIdGenerator.generateId());
AlternativeJdkIdGenerator generator = new AlternativeJdkIdGenerator();
System.out.println(generator.generateId());
SimpleIdGenerator simpleIdGenerator = new SimpleIdGenerator();
System.out.println(simpleIdGenerator.generateId());
System.out.println(simpleIdGenerator.generateId());
# 2.Assert 断言工具类
Assert断言工具类,通常用于数据合法性检查。Assert断言工具类,通常用于数据合法性检查
//对象非空
Assert.notNull(Object object, "object is required")
//对象必须为true
Assert.isTrue(Object object, "object must be true")
//集合非空
Assert.notEmpty(Collection collection, "collection must not be empty")
//字符不为null且字符长度不为0
Assert.hasLength(String text, "text must be specified")
// text 不为null且必须至少包含一个非空格的字符
Assert.hasText(String text, "text must not be empty")
//obj必须能被正确造型成为clazz 指定的类
Assert.isInstanceOf(Class clazz, Object obj, "clazz must be of type [clazz]")
# 3.PathMatcher路径匹配器
Spring提供的实现:AntPathMatcher Ant路径匹配规则 (1)SpringMVC的路径匹配规则是依照Ant的来的,实际上不只是SpringMVC,整个Spring框架的路径解析都是按照Ant的风格来的; (2)AntPathMatcher不仅可以匹配Spring的@RequestMapping路径,也可以用来匹配各种字符串,包括文件路径等。
- "?" 匹配一个字符
- "*" 匹配0个或多个字符
- "**" 匹配0个或多个目录
注意事项:
- AntPathMatcher不仅可以匹配URL路径,也可以匹配文件路径。但是需要注意AntPathMatcher也有有参构造,传递路径分隔符参数pathSeparator(若不传,默认值为/),对于文件路径的匹配来说,则需要根据不同的操作系统来传递各自的文件分隔符,以此防止匹配文件路径错误
- 最长匹配规则(has more characters),即越精确的模式越会被优先匹配到。例如,URL请求/app/dir/file.jsp,现在存在两个路径匹配模式/**/.jsp和/app/dir/.jsp,那么会根据模式/app/dir/*.jsp来匹配
AntPathMatcher antPathMatcher = new AntPathMatcher();
antPathMatcher.match("/**/demo/t?st", "/business-center/2/3/demo/test/2"); //false
antPathMatcher.match("/**/demo/t?st/**", "/business-center/2/3/demo/test/2"); //true
antPathMatcher.match("/**/demo/*", "/business-center/2/3/demo/test/2"); //false
antPathMatcher.match("/**/demo/**/*", "/business-center/2/3/demo/test/2"); //true
antPathMatcher.match("/**/demo/**", "/business-center/2/3/demo/test/2"); //true
# 4.ConcurrentReferenceHashMap
ConcurrentReferenceHashMap是自spring3.2后增加的一个同步的软(虚)引用Map
java的引用类型一共分四种引用类型(强引用、软引用、弱引用、虚引用),JDK也为我们提供了 WeakHashMap
来使用。但是,但是它并不是线程安全的。满足了我们对线程安全的弱、软引用的需求。
@Test
public void fun1() throws InterruptedException {
String key = new String("key");
String value = new String("val");
Map<String, String> map = new ConcurrentReferenceHashMap<>(8, ConcurrentReferenceHashMap.ReferenceType.WEAK);
map.put(key, value);
System.out.println(map); //{key=val}
key = null;
System.gc();
//等待一会 确保GC能够过来
TimeUnit.SECONDS.sleep(5);
System.out.println(map); //{}
}
我们发现当我们吧key置为null后,垃圾回收器会回收掉这部分内存。这就是弱、虚引用的作用,主要用来防止OOM
# 5.占位符解析工具类
- PropertyPlaceholderHelper 占位符解析,从配置文件中取值
- SystemPropertyUtils 从系统环境变量中解析占位符,底层通过 PropertyPlaceholderHelper 实现
- SpelExpressionParser
# 6.ReflectionUtils 反射工具类
# 7. ObjectUtils
org.springframework.util.ObjectUtils
isCheckedException | 判断当前异常是否是检查类异常 检查类异常:直接继承Exception的(RuntimeException 除外)。必须捕获 非检查类异常:继承自RuntimeException或Error |
isCompatibleWithThrowsClause | 检查给定的异常是否与throws子句中声明的指定异常类型兼容 |
isArray | 判断给定对象是否是数组 |
isEmpty | 判断给对象是否为空 |
unwrapOptional | 展开给定对象,该对象可能是java.util.Optional |
containsElement | 检查给定数组是否包含给定元素 |
containsConstant | 检查给定的枚举常量数组是否包含具有给定名称的常量,确定匹配时忽略大小写 |
caseInsensitiveValueOf | 根据常量名获取枚举数组中的枚举对象(忽略大小写),匹配不到时抛出 IllegalArgumentException 异常 |
addObjectToArray | 将给定对象添加到数组中,返回新数组。 |
toObjectArray | 将给定数组(可能是基元数组)转换为对象数组 |
nullSafeEquals | 确定给定的对象是否相等 Object#equals(Object) arrays 比较的是各个元素是否相当。 |
arrayEquals | |
nullSafeHashCode | |
identityToString | 返回对象整体标识的字符串表示形式。 |
getDisplayString | |
nullSafeClassName |