# 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
Last Updated: 12/15/2023, 8:18:50 AM