Spring中常用的工具类大杂烩

Spring除了给我们提供IoC和AoP之外,还为我们提供了很多工具类,方便开发。

BeanUtils

在我们的开发中经常会遇到对象的相互转换,比如DTO转VO,PO转VO.......

BeanUtils类就为我们提供了简便快捷的操作。

方法:

/**
 * 将给定源bean的属性值复制到目标bean中.
 * 注意事项:源bean和目标bean 的属性名称和类型要相同;
 * 		   如果存在内部类,内部类需要单独copy;
 *         一定要有相应的getter/setter方法.
 * */
public static void copyProperties(Object source, Object target) throws BeansException

/**
 * 将给定源bean的属性值复制到给定的目标bean中,忽略给定的一个或多个属性“ignoreProperties”.
 * */
public static void copyProperties(Object source, Object target, String... ignoreProperties) throws BeansException


/**
 * 将给定源bean的属性值复制到给定的目标bean中,仅设置在给定“可编辑”类(或接口)中定义的属性。
 * 即editable是目标类型的限定类型,也就是目标类必须是editable的子类
 * 结果只会copy editable中存在的属性
 * */
public static void copyProperties(Object source, Object target, Class<?> editable) throws BeansException

示例:

源bean

public class UserPO implements Serializable {

	private static final long serialVersionUID = 1L;
	
	private Integer id;
	
	private String name;
	
	private Integer age;
	
	private String gender;
	
	private Date birth;
	
	//省略get/set
}

目标bean

public class UserVO implements Serializable {

	private static final long serialVersionUID = 1L;
	
	private String name;
	
	private Integer age;
	
	private String gender;
	
	private Date birth;
	
	//省略get/set
}

测试及结果

public class Test {

	public static void main(String[] args) {
		UserPO userPO = new UserPO();
		userPO.setId(1000);
		userPO.setName("张三");
		userPO.setGender("男");
		userPO.setAge(20);
		userPO.setBirth(new Date());
		
		UserVO userVO_1 = new UserVO();
		BeanUtils.copyProperties(userPO, userVO_1);
		System.out.println(userVO_1.toString());
		
		System.out.println();
		System.out.println("==================我是分割线================");
		System.out.println();
		
		UserVO userVO_2 = new UserVO();
		BeanUtils.copyProperties(userPO, userVO_2, "name", "birth");
		System.out.println(userVO_2.toString());
}


UserVO [name=张三, age=20, gender=男, birth=Fri Apr 12 10:12:06 CST 2019]

==================我是分割线================

UserVO [name=null, age=20, gender=男, birth=null]

MD5

md5是一种常用的加密算法,用于确保信息传输完整一致。

md5的特点是不可逆和计算结果唯一,所以常用在需要防篡改的地方。比如:

我们的id加上的特定的盐值计算出一个md5结果,和id一起传递给客户端。服务端需要验证的时候,就需要前端将md5和id一起传回。如果id被篡改,那么重新计算的md5肯定和原md5不匹配,则说明数据被篡改,如果篡改md5一样的逻辑。

示例:

import org.springframework.util.DigestUtils;

public class Md5Test {

	/**盐值--能多复杂就多复杂,保证不可逆**/
	private static final String salt = "asd;lkk234780!32#@@kklkad++--*jasdjhhj^jkh54$";
	
	/**需要被保护的id**/
	private static final String id = "x001";
	
	/**
	 * 不管计算多少次,结果都是唯一的
	 * */
	public static void main(String[] args) {
		
		String base = id + "/" + salt;
		String md5 = DigestUtils.md5DigestAsHex(base.getBytes());
		
		System.out.println(md5);
		
		String md5_1 = DigestUtils.md5DigestAsHex(base.getBytes());
		System.out.println(md5.equals(md5_1));//计算结果唯一
	}
}

===========================运行结果================================

70c3276df57da48f6a85b41a459e50e1
true

字符串工具类StringUtils

1、判断类

StringUtils.isEmpty(String str); --是否为null或""
StringUtils.hasLength(String str); --是否为空或长度为0
StringUtils.hasText(String str); --字符串是否有内容且全不为空格且不为空
StringUtils.containsWhitespace(String str); --字符串是否包含空格
......

2、字符串操作

StringUtils.trimWhitespace(String str); --去掉字符串前后的空格
StringUtils.containsWhitespace(String str); --去掉字符串所有的空格
StringUtils.trimLeadingWhitespace(String str); --去掉字符串开头的空格
StringUtils.trimTrailingWhitespace(String str); --去掉字符串结束的空格

StringUtils.trimLeadingCharacter(String str, char leadingCharacter); --去掉字符串开头的指定字符
StringUtils.trimTrailingCharacter(String str, char trailingCharacter); --去掉字符串结尾的指定字符
StringUtils.startsWithIgnoreCase(String str, String prefix); --判断字符串是否以指定字符串开头,忽略大小写
StringUtils.endsWithIgnoreCase(String str, String suffix); --判断字符串是否以指定字符串结尾,忽略大小写

StringUtils.substringMatch(CharSequence str, int index, CharSequence substring); --判断从指定索引开始,是否匹配子字符串
StringUtils.countOccurrencesOf(String str, String sub); --判断子字符串在字符串中出现的次数
StringUtils.replace("ababaabab", "ab", "cd"); --cdcdacdcd
在字符串中使用子字符串替换
StringUtils.delete("ababaabab", "ab"); --a
删除所有匹配的子字符串
StringUtils.deleteAny("ababaabab", "bar"); --""
删除子字符串中任意出现的字符
StringUtils.quote("hello"); --"'hello'"
在字符串前后增加单引号,比较适合在日志时候使用
......

3、文件路径名称相关操作

StringUtils.unqualify("D:/abc/xxx.jpg"); -- xxx
 --得到以.分割的最后一个值,可以非常方便的获取类似类名或者文件后缀

StringUtils.unqualify("D:/abc/xxx.jpg", '/'); ---xxx.jpg 
--得到以给定字符分割的最后一个值,可以非常方便的获取类似文件名(比如xxx.jpg)

StringUtils.capitalize("abcde"); --Abcde
--首字母大写

StringUtils.uncapitalize("Java"); --java
--取消首字母大写

StringUtils.getFilename("D:/abc/xxx.pdf"); --xxx.pdf
--获取文件名

StringUtils.getFilenameExtension("D:/abc/xxx.yxy"); --txt
--获取文件后缀名

StringUtils.stripFilenameExtension("D:/abc/xxx.png"); --D:/abc/xxx
--截取掉文件后缀后的路径

StringUtils.applyRelativePath(String path, String relativePath);
找到给定的文件,和另一个相对路径的文件,返回第二个文件的全路径
D:/abc/xxx.pdf yyy.jpg -- D:/abc/yyy.jpg

StringUtils.pathEquals(String path1, String path2);
判断两个文件路径是否相同

......

4、和本地化相关

StringUtils.parseLocaleString("zh_CN"); --Locale.CHINA
从本地化字符串中解析出本地化信息,相当于Locale.toString()的逆向方法

String toLanguageTag(Locale locale); --把Locale转化成HTTP中Accept-Language能接受的本地化标准
e.g. System.out.println(StringUtils.toLanguageTag(StringUtils.parseLocaleString("zh_CN")));
比如标准的本地化字符串为:zh_CN,更改为zh-CN

5、字符串和Properties

//Properties splitArrayElementsIntoProperties(String[] array, String delimiter):
// 把字符串数组中的每一个字符串按照给定的分隔符装配到一个Properties中
String[] strs=new String[]{"key:value","key2:中文"};
Properties ps=StringUtils.splitArrayElementsIntoProperties(strs, ":");
//打印输出:{key=value, key2=中文}
System.out.println(ps);
 
//Properties splitArrayElementsIntoProperties(String[] array, String delimiter, String charsToDelete)
//把字符串数组中的每一个字符串按照给定的分隔符装配到一个Properties中,并删除指定字符串,比如括号之类的;

6、字符串和数组

StringUtils.addStringToArray(String[] array, String str); --把一个字符串添加到一个字符串数组中

StringUtils.concatenateStringArrays(String[] array1, String[]array2); --连接两个字符串数组

StringUtils.mergeStringArrays(String[] array1, String[] array2); --连接两个字符串数组,去掉重复元素

StringUtils.sortStringArray(String[] array); --字符串数组排序

StringUtils.toStringArray(Collection<String> collection); --把字符串集合变成字符串数组

StringUtils.toStringArray(Enumeration<String> enumeration); --把字符串枚举类型变成字符串数组

StringUtils.trimArrayElements(String[] array); --把字符串数组中所有字符串执行trim功能

StringUtils.removeDuplicateStrings(String[] array); --去掉给定字符串数组中重复的元素,能保持原顺序

StringUtils.split("xxx.yyy.zzz", "."); --[xxx, yyy.zzz] 
按照指定字符串分割字符串,但是只分割一次

StringUtils.tokenizeToStringArray("aa,ba,ca,da", "a,"); --[b, c, d]
会对每一个元素执行trim操作,去掉指定的字符串,并去掉空字符串

StringUtils.delimitedListToStringArray("aa,ba,ca,da", "a,"); --[a, b, c, da]
分割字符串,会把分隔符作为整体分隔符

StringUtils.commaDelimitedListToStringArray(String str); --使用逗号分割字符串

StringUtils.commaDelimitedListToSet(String str); --使用逗号分割字符串,并放到set中去重

StringUtils.collectionToDelimitedString(Collection<?> coll, String delim, String prefix, String suffix); --将一个集合中的元素,使用前缀,后缀,分隔符拼装一个字符串,前缀后后缀是针对每一个字符串的

StringUtils.collectionToDelimitedString(Collection<?> coll, String delim); --集合变成指定字符串连接的字符串

StringUtils.collectionToCommaDelimitedString(Collection<?> coll); --集合变成逗号连接的字符串

StringUtils.arrayToDelimitedString(Object[] arr, String delim); --数组使用指定字符串连接

StringUtils.arrayToCommaDelimitedString(Object[] arr); --使用逗号连接数组,拼成字符串

断言工具类Assert

Assert类通常用于检验数据的合法性(校验工具),其位于:

org.springframework.util.Assert

平常做判断通常是这样写的:

if(name == null || "".equals(name)) {
	throw new MyException("姓名不能为空");
}

用Assert工具类可以将上面的代码简化为:

Assert.hasText(name, "姓名不能为空");

简介Assert类的常用方法(不全面,其它方法可参考源码):

Assert.notNull(Object object, String message); --对象非空

Assert.isTrue(boolean expression, String message); --对象必须为true

Assert.notEmpty(Collection<?> collection, String message); --集合非空

Assert.hasLength(String text, String message); --字符不为null且字符长度不为0,不能校验多个空格

Assert.hasText(String text, String message); --text 不为null且必须至少包含一个非空格的字符

Assert.isInstanceOf(Class<?> type, Object obj, String message); --obj必须能被正确造型成为clazz 指定的类

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值