在http://blog.youkuaiyun.com/zero__007/article/details/77265239中大致介绍了Spring Boot启动过程,在SpringApplication.initialize()方法中会调用为setListeners()方法为SpringApplication添加监听器,默认的监听器是配置文件中Key为org.springframework.context. ApplicationListener的value:
在过程代码中也可以为SpringApplication添加自定义事件监听器:
那么监听器是如何工作的呢?在SpringApplication.run()方法中:
OK,接下来SpringApplication.run()方法中调用listeners.starting()方法,来看下:
SimpleApplicationEventMulticaster.multicastEvent():
在SpringApplication.run()方法执行中,依次调用了listeners.starting()、listeners.environmentPrepared(environment)、listeners.contextLoaded(context)分别对应了ApplicationStartedEvent、ApplicationEnvironmentPreparedEvent、ApplicationPreparedEvent事件。
# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.boot.ClearCachesApplicationListener,\
org.springframework.boot.builder.ParentContextCloserApplicationListener,\
org.springframework.boot.context.FileEncodingApplicationListener,\
org.springframework.boot.context.config.AnsiOutputApplicationListener,\
org.springframework.boot.context.config.ConfigFileApplicationListener,\
org.springframework.boot.context.config.DelegatingApplicationListener,\
org.springframework.boot.liquibase.LiquibaseServiceLocatorApplicationListener,\
org.springframework.boot.logging.ClasspathLoggingApplicationListener,\
org.springframework.boot.logging.LoggingApplicationListener
然后加载上述的类并实例化后,设置在SpringApplication的listeners中。
在过程代码中也可以为SpringApplication添加自定义事件监听器:
public void addListeners(ApplicationListener<?>... listeners) {
this.listeners.addAll(Arrays.asList(listeners));
}
spring boot支持的事件监听类型有如下四种:ApplicationStartedEvent、ApplicationEnvironmentPreparedEvent、ApplicationPreparedEvent、ApplicationFailedEvent。
那么监听器是如何工作的呢?在SpringApplication.run()方法中:
public ConfigurableApplicationContext run(String... args) {
……
SpringApplicationRunListeners listeners = getRunListeners(args);
listeners.starting();
try {
ApplicationArguments applicationArguments = new DefaultApplicationArguments(
args);
ConfigurableEnvironment environment = prepareEnvironment(listeners,
applicationArguments);
Banner printedBanner = printBanner(environment);
context = createApplicationContext();
analyzers = new FailureAnalyzers(context);
prepareContext(context, environment, listeners, applicationArguments,
printedBanner);
refreshContext(context);
afterRefresh(context, applicationArguments);
listeners.finished(context, null);
…….
}
来看getRunListeners():
private SpringApplicationRunListeners getRunListeners(String[] args) {
Class<?>[] types = new Class<?>[] { SpringApplication.class, String[].class };
return new SpringApplicationRunListeners(logger, getSpringFactoriesInstances(
SpringApplicationRunListener.class, types, this, args));
}
这里的getSpringFactoriesInstances(SpringApplicationRunListener.class, types, this, args),会在META-INF/spring.factories中找到:
# Run Listeners
org.springframework.boot.SpringApplicationRunListener=\
org.springframework.boot.context.event.EventPublishingRunListener
不多解释,getSpringFactoriesInstances()返回了EventPublishingRunListener实例。EventPublishingRunListener的构造方法如下:
public EventPublishingRunListener(SpringApplication application, String[] args) {
this.application = application;
this.args = args;
this.initialMulticaster = new SimpleApplicationEventMulticaster();
for (ApplicationListener<?> listener : application.getListeners()) {
this.initialMulticaster.addApplicationListener(listener);
}
}
构造方法中将SpringApplication中的监听器添加到了SimpleApplicationEventMulticaster的实例multicaster中。
OK,接下来SpringApplication.run()方法中调用listeners.starting()方法,来看下:
public void starting() {
for (SpringApplicationRunListener listener : this.listeners) {
listener.starting();
}
}
@Override
@SuppressWarnings("deprecation")
public void starting() {
this.initialMulticaster
.multicastEvent(new ApplicationStartedEvent(this.application, this.args));
}
在EventPublishingRunListener.starting()方法中,先创建一个ApplicationStartedEvent事件,将this.application传递进去,因此使用ApplicationStartedEvent监听器时可以获取SpringApplication实例。
SimpleApplicationEventMulticaster.multicastEvent():
@Override
public void multicastEvent(ApplicationEvent event) {
multicastEvent(event, resolveDefaultEventType(event));
}
@Override
public void multicastEvent(final ApplicationEvent event, ResolvableType eventType) {
ResolvableType type = (eventType != null ? eventType : resolveDefaultEventType(event));
for (final ApplicationListener<?> listener : getApplicationListeners(event, type)) {
Executor executor = getTaskExecutor();
if (executor != null) {
executor.execute(new Runnable() {
@Override
public void run() {
invokeListener(listener, event);
}
});
}
else {
invokeListener(listener, event);
}
}
}
getApplicationListeners()获取对应ApplicationEvent的listener,获取完指定事件对应监听器后,通过Executor执行一个子线程执行invokeListener(listener, event),该函数会调用监听器listener.onApplicationEvent(event)方法。
在SpringApplication.run()方法执行中,依次调用了listeners.starting()、listeners.environmentPrepared(environment)、listeners.contextLoaded(context)分别对应了ApplicationStartedEvent、ApplicationEnvironmentPreparedEvent、ApplicationPreparedEvent事件。