在开发中,我们经常会遇到如下过程:比如用户注册后,会发送邮件到用户的注册邮箱上,在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