一、前言
Spring框架自带了很多很方便的工具类,我们应该学习并在日常开发中使用它,既可以提高开发效率又可以提升性能。
二、BeanUtils
- 类路径:org.springframework.beans.BeanUtils
- 用途:提供操作JavaBean属性的便利方法,常用于复制同名属性从一个bean到另一个bean。
- 主要方法:
- copyProperties(Object source, Object target):从源对象复制属性到目标对象,忽略不同数据类型的属性。
- instantiateClass(Class<T> clazz):使用其无参构造器实例化一个类。
示例代码:
我们先创建两个实体类
package com.example.tcpclientdemo.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author qx
* @date 2024/7/5
* @des
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
private String name;
private Integer age;
}
package com.example.tcpclientdemo.dto;
import lombok.Data;
/**
* @author qx
* @date 2024/7/5
* @des
*/
@Data
public class StudentDto {
private String name;
private Integer age;
}
测试copyProperties:
package com.example.tcpclientdemo;
import com.example.tcpclientdemo.bean.Student;
import com.example.tcpclientdemo.dto.StudentDto;
import org.junit.jupiter.api.Test;
import org.springframework.beans.BeanUtils;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class TcpClientDemoApplicationTests {
@Test
void contextLoads() {
//copyProperties测试
Student student = new Student("aa", 20);
StudentDto studentDto = new StudentDto();
BeanUtils.copyProperties(student, studentDto);
System.out.println(studentDto);
}
}
执行结果:
StudentDto(name=aa, age=20)
测试instantiateClass:
package com.example.tcpclientdemo;
import com.example.tcpclientdemo.bean.Student;
import org.junit.jupiter.api.Test;
import org.springframework.beans.BeanUtils;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class TcpClientDemoApplicationTests {
@Test
void contextLoads() {
//instantiateClass
Student student = BeanUtils.instantiateClass(Student.class);
System.out.println(student);
}
}
执行结果:
Student(name=null, age=null)
三、CollectionUtils
- 类路径:org.springframework.util.CollectionUtils
- 用途:提供各种集合操作的工具方法。
- 主要方法:
- isEmpty(Collection<?> collection):检查集合是否为空或null。
- mergeArrayIntoCollection(Object array, Collection<Object> collection):将数组中的元素合并到集合中。
- findValueOfType(Collection<?> collection, Class<?> type):在集合中查找指定类型的元素。
示例代码:
package com.example.tcpclientdemo;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
@SpringBootTest
class TcpClientDemoApplicationTests {
@Test
void contextLoads() {
//isEmpty(Collection<?> collection)
List<String> list = new ArrayList<>();
System.out.println(CollectionUtils.isEmpty(list));
//mergeArrayIntoCollection(Object array, Collection<Object> collection)
String[] array = {"a", "b", "c"};
CollectionUtils.mergeArrayIntoCollection(array, list);
System.out.println(list);
}
}
执行结果:
true
[a, b, c]
四、StringUtils
- 类路径:org.springframework.util.StringUtils
- 用途:提供各种字符串处理的工具方法。
- 主要方法:
- hasText(String str):检查字符串是否包含非空白字符。
- commaDelimitedListToStringArray(String str):将逗号分隔的字符串转换为字符串数组。
- split(String toSplit, String delimiter):分割字符串但不使用正则表达式。
示例代码:
package com.example.tcpclientdemo.test;
import org.springframework.util.StringUtils;
import java.util.Arrays;
import java.util.Set;
/**
* @author qx
* @date 2024/7/5
* @des
*/
public class Demo {
public static void main(String[] args) {
//hasText(String str)
boolean flag = StringUtils.hasText("aa");
System.out.println(flag);
//commaDelimitedListToStringArray(String str)
Set<String> set = StringUtils.commaDelimitedListToSet("a,b,c,d");
System.out.println(set);
//split(String toSplit, String delimiter)
String[] array = StringUtils.split("a,b,c,d", ",");
System.out.println(Arrays.toString(array));
}
}
执行结果:
true
[a, b, c, d]
[a, b,c,d]
五、ObjectUtils
- 类路径:org.springframework.util.ObjectUtils
- 用途:提供各种对象操作的工具方法。
- 主要方法:
- isEmpty(Object obj):检查对象、数组是否为空或null。
- nullSafeEquals(Object o1, Object o2):null安全的比较两个对象是否相等。
示例代码:
package com.example.tcpclientdemo.test;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
import java.util.Arrays;
import java.util.Set;
/**
* @author qx
* @date 2024/7/5
* @des
*/
public class Demo {
public static void main(String[] args) {
String a = null;
//输出true
System.out.println(ObjectUtils.isEmpty(a));
String b = null;
//输出true
System.out.println(ObjectUtils.nullSafeEquals(a, b));
}
}
执行结果:
true
true
六、ReflectionUtils
- 类路径:org.springframework.util.ReflectionUtils
- 用途:提供反射相关的工具方法,简化对Java反射API的使用。
- 主要方法:
- doWithFields(Class<?> clazz, ReflectionUtils.FieldCallback fc):对指定类的每个字段执行给定的回调。
- findMethod(Class<?> clazz, String name, Class<?>... paramTypes):在指定类中查找方法。
示例代码:
package com.example.tcpclientdemo.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author qx
* @date 2024/7/5
* @des
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
private String name;
private Integer age;
public void show() {
System.out.printf("name:%s,age:%d", name, age);
}
}
package com.example.tcpclientdemo.test;
import com.example.tcpclientdemo.bean.Student;
import org.springframework.util.ObjectUtils;
import org.springframework.util.ReflectionUtils;
import org.springframework.util.StringUtils;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Set;
/**
* @author qx
* @date 2024/7/5
* @des
*/
public class Demo {
public static void main(String[] args) {
Student student = new Student("aa", 20);
//通过反射获取Student类中的show方法
Method method = ReflectionUtils.findMethod(Student.class, "show");
//执行show方法
ReflectionUtils.invokeMethod(method, student);
}
}
执行结果:
name:aa,age:20
七、ClassUtils
- 类路径:org.springframework.util.ClassUtils
- 用途:提供与类和类加载器相关的工具方法。
- 主要方法:
- getDefaultClassLoader():获取默认类加载器。
- isPresent(String className, ClassLoader classLoader):检查给定名称的类是否存在。
示例代码:
package com.example.tcpclientdemo.test;
import com.example.tcpclientdemo.bean.Student;
import org.springframework.util.ClassUtils;
import org.springframework.util.ObjectUtils;
import org.springframework.util.ReflectionUtils;
import org.springframework.util.StringUtils;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Set;
/**
* @author qx
* @date 2024/7/5
* @des
*/
public class Demo {
public static void main(String[] args) {
//获取默认类加载器
ClassLoader classLoader = ClassUtils.getDefaultClassLoader();
//检查给定名称的类是否存在。
boolean flag = ClassUtils.isPresent("com.example.tcpclientdemo.bean.Student", classLoader);
System.out.println(flag);
boolean flag1 = ClassUtils.isPresent("com.example.tcpclientdemo.bean.Person", classLoader);
System.out.println(flag1);
}
}
执行结果:
true
false
八、AopUtils
- 类路径:org.springframework.aop.support.AopUtils
- 用途:提供与面向切面编程相关的工具方法。
- 主要方法:
- isAopProxy(Object obj):检查给定对象是否为AOP代理。
- getTargetClass(Object candidate):获取代理对象背后的目标类。
九、PropertyAccessorUtils
- 类路径:org.springframework.beans.PropertyAccessorUtils
- 用途:提供属性访问器相关的工具方法。
- 主要方法:
- getPropertyAccessorName(String propertyName):从复合属性名中获取最终的属性访问器名。
十、FileCopyUtils
- 类路径:org.springframework.util.FileCopyUtils
- 用途:提供文件复制相关的工具方法。
- 主要方法:
- copy(byte[] in, OutputStream out):将字节数组复制到输出流。
- copy(File in, File out):将一个文件内容复制到另一个文件。
示例代码:
package com.example.tcpclientdemo.test;
import com.example.tcpclientdemo.bean.Student;
import org.springframework.aop.support.AopUtils;
import org.springframework.util.*;
import java.io.*;
import java.lang.reflect.Method;
import java.nio.file.Files;
import java.util.Arrays;
import java.util.Set;
/**
* @author qx
* @date 2024/7/5
* @des
*/
public class Demo {
public static void main(String[] args) throws IOException {
String str = "hello,world";
byte[] bytes = str.getBytes();
//文件保存的路径
File file = new File("E:" + File.separator + "test" + File.separator + "demo.txt");
if (!file.getParentFile().exists()) {
file.getParentFile().mkdir();
}
OutputStream outputStream = Files.newOutputStream(file.toPath());
FileCopyUtils.copy(bytes, outputStream);
outputStream.close();
}
}
执行结果:
十一、ResourceUtils
- 类路径:org.springframework.util.ResourceUtils
- 用途:识别资源加载的工具类,帮助加载类路径或者文件系统内的资源文件。
- 主要方法:
- getFile(String resourceLocation):根据资源路径获取文件。
- getURL(String resourceLocation):根据资源路径获取URL。
示例代码:
package com.example.tcpclientdemo.test;
import org.springframework.util.*;
import java.io.*;
import java.net.URL;
/**
* @author qx
* @date 2024/7/5
* @des
*/
public class Demo {
public static void main(String[] args) throws IOException {
String filePath = "E:" + File.separator + "test" + File.separator + "demo.txt";
File file = ResourceUtils.getFile(filePath);
System.out.println(file.getAbsolutePath());
URL url = ResourceUtils.getURL(filePath);
System.out.println(url);
}
}
执行结果:
E:\test\demo.txt
file:/E:/test/demo.txt
十二、TransactionSynchronizationManager
- 类路径:org.springframework.transaction.support.TransactionSynchronizationManager
- 用途:用于事务同步,管理资源和事务同步相关的回调。
- 主要方法:
- bindResource(Object key, Object value):绑定资源到当前事务。
- getResource(Object key):获取绑定到当前事务的资源。
十三、WebUtils
- 类路径:org.springframework.web.util.WebUtils
- 用途:为Web应用程序提供工具方法。
- 主要方法:
- getRealPath(ServletContext servletContext, String path):获取相对于Web应用根目录的真实路径。
- findParameterValue(Map<String, ?> params, String paramName):在参数Map中查找指定的参数值。
示例代码:
package com.example.tcpclientdemo.controller;
import com.example.tcpclientdemo.service.IndexService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.util.WebUtils;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import java.io.FileNotFoundException;
import java.time.Duration;
import java.time.Instant;
import java.util.concurrent.CompletableFuture;
/**
* @author qx
* @date 2024/7/4
* @des
*/
@Slf4j
@RestController
public class IndexController {
@GetMapping("/index")
public String testIndex(HttpServletRequest request) throws FileNotFoundException {
ServletContext servletContext = request.getServletContext();
String path = WebUtils.getRealPath(servletContext, "TestController");
log.info("path:{}", path);
return "index success";
}
}
执行结果:
2024-07-05 10:33:02.805 INFO 2084 --- [nio-8080-exec-2] c.e.t.controller.IndexController : path:C:\Users\qx\AppData\Local\Temp\tomcat-docbase.8080.7796970697002068219\TestController
这些工具类在Spring应用开发中起到关键的辅助作用,减少了代码的重复编写,提高了开发效率。需要注意的是,不同版本的Spring可能在这些工具类的API上有所变动,因此在使用时应查阅对应版本的Spring文档。