首页 > 编程语言 > 详细

Spring事件监听机制

时间:2020-04-06 19:10:04      阅读:68      评论:0      收藏:0      [点我收藏+]

在开发中,我们经常会遇到如下过程:比如用户注册后,会发送邮件到用户的注册邮箱上,在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注解实现异步监听事件的调用。

 

  

 

Spring事件监听机制

原文:https://www.cnblogs.com/zengjiao/p/12643346.html

(1)
(1)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!