事件处理机制⭐️
QuickStart
步骤:
-
设置一个Event.
public class LoginSuccessEvent extends ApplicationEvent {
public LoginSuccessEvent(User user) {
super(user);
}
public User getUser() {
return (User) super.getSource();
}
}
解释:
这个
Event
的作用就是作为发布的信息载体
,EventListener
接收到之后,都是从这个Event
上面拿到信息的注意:
这个类要继承自(extends)
ApplicationEvent
类
-
设置一个EventPublish
@Component
public class LoginSuccessEventPublisher {
@Autowired
private ApplicationEventPublisher publisher;
public void publishEvent(User user) {
LoginSuccessEvent event = new LoginSuccessEvent(user);
publisher.publishEvent(event);
System.out.println("LoginSuccessEvent published:对象是:\n"+event.getUser());
}
}
注意:
要把这个
EventPublish
通过@Component
放入到IoC容器中去那个
ApplicationEventPublisher
要写在这个类的属性中去, 到时候Spring会自动将这个类通过构造方法注入到这里(Spring默认Bean机制)这个
public void publishEvent(User user) {...}
的方法名字可以随便命名
-
设置一个EventListener
@Component
public class LoginSuccessEventListener {
@EventListener
@Async
public void get5Counts(LoginSuccessEvent event) throws InterruptedException {
System.out.println("5积分开始运行");
Thread.sleep(3000);
System.out.println(event.getUser().getUuid()+":"+event.getUser().getUserName()+"登录成功,获取5积分");
}
@EventListener
public void get10Counts(LoginSuccessEvent event) throws InterruptedException {
System.out.println("10积分开始运行");
Thread.sleep(3000);
System.out.println(event.getUser().getUuid()+":"+event.getUser().getUserName()+"你很帅, 再获取10积分");
}
@EventListener
public void tongBu(LoginSuccessEvent event) throws InterruptedException {
System.out.println("同步方法");
Thread.sleep(3000);
System.out.println(event.getUser().getUuid()+":"+event.getUser().getUserName()+"同步方法");
}
}
注意:
加上
@Component
注解当事件被发布之后, 那么Listener会接受到, 然后开始执行
EventListener
中所有的方法.EventListener
中所有方法默认同步执行
.( 也就是说, 假如这个EventListener类中有a, b ,c 三个方法..那么会先执行a方法,等a方法结束,再执行b方法...最后执行c方法)在
SpringBootApplication
应用头上加上@EnableAsync
, 然后再自己的监听类中的方法上加上@Async
的加, 就可以开启异步处理功能.( 也就是说, 假如这个EventListener类中有a, b ,c 三个方法..那么a,b,c将会一起执行)
@Order
注解用于定义多个监听器或监听方法的执行顺序。数值越小,优先级越高,越先执行。@Order
可以应用于类级别(控制整个监听器类的优先级)或方法级别(控制同一个类中不同监听方法的执行顺序)。
设置定时任务(@EnableSchedule)
QuickStart
-
自定义一个类, 放入IoC容器. 然后在类里面写好自己的定时任务方法, 然后使用
@Scheduled
注解进行配置 -
然后在SpringBootApplication上加上注解
@EnableScheduling
Detail
拓展知识:
-
fixedRate
含义: 指定任务以固定的时间间隔执行,不论前一个任务是否完成。任务开始后,间隔固定的时间,下一次任务会再次启动。
-
单位: 毫秒(ms)
-
示例:
@Scheduled(fixedRate = 5000) public void runTask() { // 任务每5秒执行一次 }
在这个示例中,
runTask
方法每隔5秒执行一次,即使上一个任务还未执行完毕,新的任务也会开始执行。
-
fixedDelay
-
含义: 指定任务在前一个任务完成后等待固定的时间间隔,再开始执行下一个任务。也就是说,任务执行的时间间隔是从上一个任务完成后开始计算的。
-
单位: 毫秒(ms)
-
示例:
@Scheduled(fixedDelay = 5000) public void runTaskWithFixedDelay() { // 任务执行完成后等待5秒再执行 }
在这个示例中,
runTaskWithFixedDelay
方法在上一个任务执行完成后,会等待5秒再执行下一次任务。
-
initialDelay
-
含义: 指定任务首次执行的延迟时间。通常与
fixedRate
或fixedDelay
一起使用,表示在应用启动后,等待一段时间再开始第一次执行任务。 -
单位: 毫秒(ms)
-
示例:
@Scheduled(fixedRate = 5000, initialDelay = 10000) public void runTaskWithInitialDelay() { // 应用启动10秒后开始执行,然后每5秒执行一次 }
在这个示例中,
runTaskWithInitialDelay
方法会在应用启动10秒后开始执行,然后每隔5秒执行一次任务。
-
cron
-
含义: 使用Cron表达式定义任务的执行时间。Cron表达式可以非常灵活地定义复杂的时间规则,例如每天的某个时刻、每周的某几天等。
-
单位: Cron表达式由6或7个字段组成,依次表示秒、分钟、小时、日期、月份、星期、年份(可选)。
-
示例:
@Scheduled(cron = "0 0 3 * * ?") public void runTaskWithCron() { // 每天凌晨3点执行 }
在这个示例中,
runTaskWithCron
方法会在每天凌晨3点执行一次。Cron表达式的格式:
-
秒(0–59)
-
分钟(0–59)
-
小时(0–23)
-
日期(1–31)
-
月份(1–12)
-
星期(0–7)(0或7表示星期日)
-
年份(可选)
特殊符号:
-
\*
: 任意值 -
,
: 列出枚举值 -
-
: 指定范围 -
/
: 指定间隔 -
?
: 不指定具体值(用于日期和星期字段冲突时)
例如,
"0 0/15 8-10 * * *"
表示每天上午8点到10点之间,每15分钟执行一次。 -
-
zone
-
含义: 指定任务执行时的时区。可以配合
cron
表达式使用,以确保任务在正确的时区执行。 -
示例:
@Scheduled(cron = "0 0 10 * * ?", zone = "America/New_York") public void runTaskWithZone() { // 每天上午10点(纽约时间)执行 }
在这个示例中,
runTaskWithZone
方法会在纽约时间每天上午10点执行。
流式响应文件(ResourceLoader)
QuickStart
步骤:
-
根据路径获取到文件资源
-
然后获取成功之后放入ResponseEntity的.body方法中就好,即可实现流式传输
@RestController
@CrossOrigin
@RequestMapping("/test")
public class TestFile {
@Autowired
private ResourceLoader resourceLoader;
@GetMapping("get/file")
public ResponseEntity<Resource> test() throws IOException {
Resource resource = resourceLoader.getResource("file:C:/Users/86136/OneDrive/桌面/好/1713805670696.png");
// 设置响应头
HttpHeaders headers = new HttpHeaders();
headers.set(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + resource.getFilename());
// 修改后的代码
String fileName = resource.getFilename();
String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString());
// headers.set(HttpHeaders.CONTENT_DISPOSITION, "inline; filename=\"" + encodedFileName + "\"");
// 使用流式响应
ResponseEntity<Resource> res= ResponseEntity.ok()
.headers(headers)
.contentLength(resource.contentLength())
.body(resource);
return res;
}
}
优质Utils类库(Hutool)
Detail
-
StrUtil
(字符串工具类)⭐️-
功能: 提供字符串的各种操作,如判断、分割、拼接、格式化等。
-
示例:
String result = StrUtil.format("Hello, {}!", "World"); // 格式化字符串 boolean isBlank = StrUtil.isBlank(" "); // 判断字符串是否为空白 String[] parts = StrUtil.split("a,b,c", ','); // 分割字符串
-
-
DateUtil
(日期工具类)⭐️⭐️-
功能: 提供日期时间的解析、格式化、计算、比较等。
-
示例:
Date date = DateUtil.date(); // 获取当前时间 String now = DateUtil.now(); // 获取当前时间字符串,格式: yyyy-MM-dd HH:mm:ss Date startOfDay = DateUtil.beginOfDay(date); // 获取一天的开始时间 long betweenDays = DateUtil.between(date1, date2, DateUnit.DAY); // 计算两个日期之间的天数
-
-
SecureUtil
(安全工具类)⭐️-
功能: 提供各种加密、解密、摘要算法的实现,如 MD5、SHA、AES、DES 等。
-
示例:
String md5 = SecureUtil.md5("password"); // 生成MD5摘要 String aesEncrypted = SecureUtil.aes().encryptHex("password"); // AES加密
-
-
FileUtil
(文件工具类)-
功能: 提供文件和目录操作,如读取、写入、删除、复制、压缩等。
-
示例:
File file = FileUtil.file("test.txt"); // 创建文件对象 String content = FileUtil.readUtf8String(file); // 读取文件内容 FileUtil.writeUtf8String("Hello, Hutool!", file); // 写入内容到文件 FileUtil.copy("source.txt", "dest.txt", true); // 复制文件
-
-
HttpUtil
(HTTP工具类)⭐️-
功能: 提供简单易用的 HTTP 客户端功能,可以轻松发起 GET、POST 请求,并处理响应。
-
示例:
String result = HttpUtil.get("https://www.example.com"); // 发起GET请求 Map<String, Object> params = new HashMap<>(); params.put("key", "value"); String response = HttpUtil.post("https://www.example.com", params); // 发起POST请求
-
-
JsonUtil
(JSON工具类)-
功能: 提供 JSON 的解析和生成方法,基于
JSONObject
和JSONArray
。 -
示例:
String json = "{\"name\":\"Hutool\", \"age\":5}"; JSONObject jsonObject = JSONUtil.parseObj(json); String name = jsonObject.getStr("name"); // 获取JSON中的字段
-
-
Convert
(类型转换工具类)⭐️⭐️-
功能: 提供各种类型之间的转换,如字符串到数字、集合到数组、对象到字符串等。
-
示例:
int num = Convert.toInt("123"); // 字符串转为数字 String[] array = Convert.toStrArray("a,b,c"); // 字符串转为数组 Date date = Convert.toDate("2024-08-13"); // 字符串转为日期
-
-
CollUtil
(集合工具类)⭐️⭐️-
功能: 提供对集合的各种操作,如过滤、排序、分组、交集、并集等。
-
示例:
List<String> list = CollUtil.newArrayList("a", "b", "c"); List<String> subList = CollUtil.sub(list, 0, 2); // 获取子列表 List<String> union = CollUtil.union(list1, list2); // 求集合的并集
-
-
IdUtil
(ID生成工具类)⭐️-
功能: 提供唯一 ID 的生成方法,如 UUID、雪花算法等。
-
示例:
String uuid = IdUtil.randomUUID(); // 生成UUID long snowflakeId = IdUtil.getSnowflake(1, 1).nextId(); // 生成雪花算法ID
-
-
Validator
(数据校验工具类)⭐️⭐️
-
功能: 提供常见的校验功能,如邮箱、手机号、身份证号码、IP 地址等的校验。
-
示例:
boolean isEmail = Validator.isEmail("test@example.com"); // 校验邮箱格式 boolean isMobile = Validator.isMobile("13800138000"); // 校验手机号格式 boolean isIP = Validator.isIpv4("192.168.1.1"); // 校验IPv4地址格式
-
MapUtil
(Map工具类)⭐️⭐️
-
功能: 提供对
Map
的常用操作,如创建、过滤、排序、合并等。 -
示例:
Map<String, String> map = MapUtil.of("a", "1", "b", "2"); Map<String, String> sortedMap = MapUtil.sort(map); // 对Map按键排序
-
XmlUtil
(XML工具类)
-
功能: 提供 XML 的解析和生成方法。
-
示例:
Document doc = XmlUtil.parseXml("<root><name>Hutool</name></root>"); String name = XmlUtil.getElementText(doc.getDocumentElement(), "name"); // 获取XML中的元素文本
-
BeanUtil
(Bean工具类)
-
功能: 提供对 JavaBean 的操作,如属性拷贝、对象转换等。
-
示例:
User user = new User(); BeanUtil.copyProperties(map, user); // 将Map中的属性拷贝到JavaBean
-
ReflectUtil
(反射工具类)
-
功能: 提供对 Java 反射的常用操作,如获取类信息、调用方法、修改字段等。
-
示例:
Method method = ReflectUtil.getMethod(User.class, "getName"); ReflectUtil.invoke(user, method); // 反射调用方法
-
SystemUtil
(系统工具类)⭐️
-
功能: 提供对系统属性、环境变量的获取和操作。
-
示例:
String javaVersion = SystemUtil.getJavaInfo().getVersion(); // 获取Java版本 Map<String, String> env = SystemUtil.getEnv(); // 获取系统环境变量
-
NumberUtil
(数字工具类)⭐️⭐️
-
功能: 提供对数字的常用操作,如精确计算、比较、格式化等。
-
示例:
double result = NumberUtil.add(1.2, 3.4); // 精确加法 boolean isNumber = NumberUtil.isNumber("123"); // 判断是否为数字
-
ArrayUtil
(数组工具类)⭐️
-
功能: 提供对数组的常用操作,如查找、排序、合并等。
-
示例:
int[] array = {1, 2, 3, 4, 5}; int[] reversed = ArrayUtil.reverse(array); // 反转数组 boolean contains = ArrayUtil.contains(array, 3); // 判断数组是否包含某元素
-
ClassUtil
(类工具类)⭐️
-
功能: 提供对类的常用操作,如获取类名、包名、字段、方法等。
-
示例:
String className = ClassUtil.getClassName(User.class); // 获取类名 Field[] fields = ClassUtil.getDeclaredFields(User.class); // 获取类的所有字段
-
RegexUtil
(正则工具类)
-
功能: 提供对
正则表达式的常用操作,如匹配、替换、提取等。
-
示例:
boolean match = RegexUtil.isMatch("\\d+", "123"); // 判断是否匹配数字 String[] groups = RegexUtil.findAll("\\d+", "12a34b56c"); // 提取所有匹配的数字 String replaced = RegexUtil.replaceAll("a1b2c3", "\\d", "*"); // 替换数字为 *
-
ThreadUtil
(线程工具类)
-
功能: 提供线程操作的常用方法,如创建线程池、休眠、异步执行等。
-
示例:
ThreadUtil.sleep(1000); // 线程休眠1秒 ExecutorService executor = ThreadUtil.newExecutor(); // 创建一个新的线程池 ThreadUtil.execute(() -> System.out.println("异步执行任务")); // 异步执行任务
-
ZipUtil
(压缩工具类)⭐️
-
功能: 提供对 ZIP 压缩和解压缩的操作。
-
示例:
ZipUtil.zip("srcDir", "dest.zip"); // 压缩目录为ZIP文件 ZipUtil.unzip("dest.zip", "outputDir"); // 解压缩ZIP文件到指定目录
-
FileWatcher
(文件监视器)