在开发中,我们经常会遇到如下过程:比如用户注册后,会发送邮件到用户的注册邮箱上,在spring中常用事件监听机制来执行。以下为相关代码。
1、首先自定义事件源。
public class DeviceStatusEvent extends ApplicationEvent {
private Object source;
public DeviceStatusEvent(Object source) {
super(source);
this.source=source;
}
@Override
public Object getSource() {
return source;
}
}
2、事件的发布对象
Spring的事件的发布定义在ApplicationEventPublisher类中,而ApplicationContext继承了这个类,因此ApplicationContext具有发布事件的能力,而且已经注入Spring的bean容器中,可直接获取。
@Component
@Slf4j
public class SpringContextHolder implements ApplicationContextAware, DisposableBean {
private static ApplicationContext applicationContext = null;
public SpringContextHolder() {
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) {
SpringContextHolder.applicationContext = applicationContext;
}
public static <T> T getBean(Class<T> requiredType) {
return applicationContext.getBean(requiredType);
}
public static void clearHolder() {
if (log.isDebugEnabled()) {
log.debug("清除SpringContextHolder中的ApplicationContext:" + applicationContext);
}
applicationContext = null;
}
public static void publishEvent(ApplicationEvent event) {
if (applicationContext != null) {
applicationContext.publishEvent(event);
}
}
@Override
public void destroy() {
try {
clearHolder();
} catch (Throwable var2) {
throw var2;
}
}
}
3、事件监听(默认是同步的)
@Component
public class DeviceStatusListener implements ApplicationListener<DeviceStatusEvent> {
@Override
public void onApplicationEvent(DeviceStatusEvent event) {
System.out.println("事件监听结果");
}
}
4、进行调用
SpringContextHolder.publishEvent(new DeviceStatusEvent(cameraStatus));
如果是使用异步监听的话,那么除了第三步需要变动,其他不用变动。
方法:Spring使用ThreadPoolTaskExecutor来执行异步任务,其实就是SchedulingTaskExecutor,使用@EnableAsync注解@Async注解实现异步监听事件的调用。
原文:https://www.cnblogs.com/zengjiao/p/12643346.html