应用监听器

概述

Spring 应用启动流程一文中,了解到Spring应用在启动时,可通过高级启动模式中的addListeners或扩展文件spring.factories 来注册应用监听器(ApplicationListener)。

那么,什么是应用监听器呢?

监听器

应用监听器(ApplicationListener) 是 Spring 提供的 SPI 扩展点之一,用于监听容器内发生的事件(ApplicationEvent),定义了一个处理应用事件的回调方法onApplicationEvent(Event)

基定义如下:

package org.springframework.context;

@FunctionalInterface
public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {

    /**
     * Handle an application event.
     * @param event the event to respond to
     */
    void onApplicationEvent(E event);

}

自定义监听器

应用使用者可以自定义实现应用监听器,监听应用内的事件,处理自己的业务。

如监听应用启动完成事件ApplicationReadyEvent

实现 ApplicationListener

1.

package org.ifinal.finalframework.context.listener;

@Slf4j
@SpringApplicationListener
public class ApplicationReadyEventListener implements ApplicationListener<ApplicationReadyEvent> {

    @Override
    public void onApplicationEvent(final ApplicationReadyEvent event) {
        logger.info("Application Ready!!!");
    }

}
  1. 注册
package org.ifinal.finalframework.example;

@SpringBootApplication
public class FinalApplication {

    public static void main(final String[] args) {
        SpringApplication application = new SpringApplication(FinalApplication.class);
        application.addListeners(new ApplicationReadyEventListener());
        application.run(args);
    }

}
# org.springframework.context.ApplicationListener
org.springframework.context.ApplicationListener=\
org.ifinal.finalframework.context.listener.ApplicationReadyEventListener

spring.factories是Spring提供的SPI配置文件,开发者可以在此配置自定义的扩展,以扩展Spring的功能。

ApplicationListener由Spring通过getSpringFactoriesInstances方法加载。

使用 @EventListener

package org.ifinal.finalframework.example;

@Slf4j
@SpringBootApplication
public class FinalApplication {

    @EventListener
    public void onReady(ApplicationReadyEvent readyEvent) {
        logger.info("onReady from @EventListener");
    }

}

运行

--2021-01-15 15:19:21.157 - INFO 6522 --- [           main] o.i.f.example.FinalApplication           : [                                      ] : onReady from @EventListener
--2021-01-15 15:19:21.159 - INFO 6522 --- [           main] o.i.f.c.l.ApplicationReadyEventListener  : [                                      ] : Application Ready!!!
--2021-01-15 15:19:21.159 - INFO 6522 --- [           main] o.i.f.example.FinalApplication           : [                                      ] : onReady from ApplicationListener

应用事件

通过IDE工具,可以发现ApplicationEvent有一个SpringApplicationEvent的抽象类,该类定义了Spring应用事件的基本组成。

Spring 应用事件

Spring 内置了一系列的 Spring 应用事件(SpringApplicationEvent),以供开发者监听并处理。

Build-In Application Listener