在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
。
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!!!");
}
}
ConfigurableApplicationContext.addApplicationListener
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);
}
}
spring.factories
# org.springframework.context.ApplicationListener
org.springframework.context.ApplicationListener=\
org.ifinal.finalframework.context.listener.ApplicationReadyEventListener
spring.factories
是Spring提供的SPI配置文件,开发者可以在此配置自定义的扩展,以扩展Spring的功能。
ApplicationListener
由Spring通过getSpringFactoriesInstances
方法加载。
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 应用事件(SpringApplicationEvent
),以供开发者监听并处理。