Spring的事件监听机制用法

事件监听的简单讲解:

在一个完整的事件体系中,除了事件和监听器以外,还应该有3个概念;

1. 事件源:事件的产生者,任何一个event都必须有一个事件源;

2. 事件广播器:它是事件和事件监听器之间的桥梁,负责把事件通知给事件监听器;

3. 事件监听器注册表:就是spring框架为所有的监听器提供了一个存放的地方;

通过流程图,可以看出它们是如何各司其职的,如下:

结构分析:

1. 事件类(ApplicaitonEvent):目前spring框架本身仅仅提供了几个事件,很多的事件都是需要自定义的。

 ApplicationEvent唯一的构造函数是ApplicaitonEvent(Object source),通过source指定事件源。 它有两个子类;

(1)ApplicationContextEvent:容器事件,也就是说事件源是ApplicationContext,框架提供了四个子类,分别代表容器启动,刷新,停止和关闭事件。

(2)RequestHandleEvent:这是一个与Web应用相关的事件,当一个请求被处理后,才会产生该事件。

一般来说,我们都是扩展ApplicationEvent来自定义事件。下面会有栗子。

一般自定义事件的话,都是继承父类ApplicationContextEvent

构造一个事件示例如下:

public class MailSendEvent extends ApplicationContextEvent {
    private String to;   //目的地

    //构造函数
    public MailSendEvent(ApplicationContext source, String to) {
        super(source);
        this.to = to;
    }
}

2.发送事件

通过容器本身 applicationContext 的publishEvent来发送

MailSendEvent event = new MailSendEvent(applicationContext, to);
applicationContext.publishEvent(event);   //同步事件通知

3. 事件监听器接口(ApplicationListener)

有两种方法:

一:所有的监听器都需要实现该接口,该接口只定义了一个方法:onApplicaitonEvent (E event),该方法接收事件对象,在该方法中编写事件的响应处理逻辑。

示例如下:

public class MailSendListener implements ApplicationListener<MailSendEvent> {
    @Override
    public void onApplicationEvent(MailSendEvent mailSendEvent) {
        MailSendEvent event = mailSendEvent;
        System.out.println("MailSender向" + event.getTo() + "发送了邮件" + ";线程为:" + Thread.currentThread().getName()); 
        System.out.println("第一步处理结束-------");
    }
}

二:通过@EventListener(MailSendEvent.class)注解

@Component
public class MailSendListenerAnnotion {
    @EventListener(MailSendEvent.class)
    public void sendSms() {
        System.out.println("注解监听器开始发送短信..." + ";线程为:" + Thread.currentThread().getName());
        try {
            Thread.currentThread().sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("注解监听器执行结束");
    }

}

Spring的事件监听机制就是观察者模式的一种体现

经验分享 程序员 微信小程序 职场和发展