事件监听的简单讲解:https://www.cnblogs.com/xinde123/p/8918714.html
在一个完整的事件体系中,除了事件和监听器以外,还应该有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的事件监听机制就是观察者模式的一种体现