事件处理分为同步和异步,在实际开发中可根据不同的业务场景来进行选择。例如发邮件时,前端不需要知道邮件究竟发成功过没有,此时可以使用异步;如果某些场景前端需要知道结果,则应该使用同步
springboot的事件主要分为三个部分:
1. 事件类(继承自org.springframework.context.ApplicationEvent)
2. 事件监听类(实现org.springframework.context.ApplicationListener接口)
3. 获取发布事件的publisher,在需要发布事件的类上实现(org.springframework.context.ApplicationEventPublisherAware)接口即可获得发布事件的对象
事件类
public class TestEvent extends ApplicationEvent {
public TestEvent(Object source) {
super(source);
}
}
事件监听类
@Component
public class TestEventListener implements ApplicationListener<TestEvent> {
/**
* @Async 注解代表该事件为异步处理,要想实现异步,还需要在启动类上增加 @EnableAsync注解
* @param event
*/
@Override
@Async
public void onApplicationEvent(TestEvent event) {
System.out.println("***********");
try {
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(event.getSource());
}
}
发布事件
@RequestMapping("/test")
@RestController
public class TestController implements ApplicationEventPublisherAware {
private ApplicationEventPublisher publisher;
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
this.publisher = applicationEventPublisher;
}
@GetMapping("")
public void test() throws Exception {
// 发布事件
publisher.publishEvent(new TestEvent(new Object()));
}
}