IOC事件与事件监听

93 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第27天,点击查看活动详情

事件与事件监听属于spring中进阶部分的内容了,可能在平时开发中用的较少,但这部分的学习理解一人很有必要。

下面开始正式讲解:

0.观察者模式

说到观察者模式大家可能印象较少,而发布订阅模式却经常出现在大家眼里,其实发布订阅与观察者模式是一个东西。发布者(观察者)发布message(事件)通知给订阅者,订阅者订阅发布者发布的message。

1.spring中的观察者模式

驱动spring中的事件的核心包括事件源、事件、广播器、监听器。

  • 事件源类似于前面提到发布者或观察者,是事件发布的对象。
  • 事件类似于前面发布者发布的message,指事件源发布的信息或做出的动作。
  • 广播器类似于通过广播将发布者发布的信息放大了,就好比一个人拿着喇叭说话,这个喇叭就充当广播器的作用。
  • 监听器类似于前面提到的订阅者是接受消息(事件)的对象,监听事件的对象。

2.事件与监听器快速入门

spring中内置了ApplicationListener监听器接口,直接去实现这个接口就可以自定义监听器了。这个接口带有一个泛型,传入的是监听的事件。

事件介绍:

  • ApplicationEvent
  • ApplicationContextEvent它在构造时,会把 IOC 容器一起传进去,这意味着事件发生时,可以通过监听器直接取到 ApplicationContext 而不需要做额外的操作
  • 下面两组是基于ApplicationContextEvent扩展的
  • ContextRefreshedEvent:代表容器刷新完毕,但还未启动
  • ContextClosedEvent:容器即将关闭。
  • ContextStartedEvent这个触发的时机是在所有单例Bean创建完成时。
  • ContextStoppedEvent事件是在ContextClosedEvent触发之后才会触发。

下面这是一个自定义监听器的例子:泛型里面传的事件就是要监听的事件,监听到事件后就会执行onApplicationEvent这个方法。

@Component
public class ContextrefreshedApplicationListener implements ApplicationListener<ContextRefreshedEvent> {
    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
        System.out.println("监听器监听到ContextRefreshedEvent事件!");
    }
}

启动类:

public class QuickstartListenerApplication {
    public static void main(String[] args) {
        System.out.println("准备初始化IOC容器。。。");
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext("com.lyz.spring16");
        System.out.println("IOC容器初始化完成。。。");
        ctx.close();
        System.out.println("IOC容器关闭。。。");
    }
}

案例中,IOC初始化时,我们监听到了容器刷新完毕事件。然后IOC初始化完成,并关闭容器。倘若我们把ContextClosedEvent事件做一个监听,那当执行ctx.close这行代码时,就会监听到容器即将关闭这个事件。

除了上述到实现监听接口的方法,spring还引入了事件监听@EventListener这个注解,我们不需要继承实现任何接口或类,在方法上标注这个注解即可,当然方法中要传入事件参数。如;

   @EventListener
    public void onContextClosedEvent(ContextClosedEvent event) {
        System.out.println("ContextClosedApplicationListener监听到ContextClosedEvent事件!");
    }

最后提一下@Order这个注解,这个注解可以对事件进行排序,如@Order(1)