1 Java 监听机制
springboot监听机制,其实是对java提供的事件监听机制的封装。
Java中的事件监听机制定义了以下几个角色:
事件:Event,继承EventObject类,例如点击,拖动等等。
事件源:Source,任意对象的Object
监听器:Listener,实现EventListener接口对象,用来监听事件源上是否有事件
2 springboot 监听机制
springboot项目启动时,会对几个监听器进行回调,我们可以实现这些监听器接口用来处理我们自己的逻辑。常见接口:
ApplicationContextlnitializer
SpringApplicationRunListener
CommandLineRunner
ApplicationRunner
CommandLineRunner 和ApplicationRunner
1、不需要额外配置,仅仅实现该接口
2、实现该接口,重写run方法。
3、项目启动后,方法执行。
![](https://i-blog.csdnimg.cn/blog_migrate/c9ceafb0eb19e60d750312f558d40529.png)
ApplicationContextlnitializer
作用:项目启动时,准备一些资源。
步骤:
需要创建MATE-INF/spring.factories
配置org.springframework.context.ApplicationContextInitializer=\com.msf.listener.MyApplicationContextInitializer
结果:
![](https://i-blog.csdnimg.cn/blog_migrate/2e2dee7e2962e58c2aebf78642aec8aa.png)
SpringApplicationRunListener
作用:spring声明周期相关的监听接口;
步骤:与ApplicationContextlnitializer配置相同
结果:
![](https://i-blog.csdnimg.cn/blog_migrate/adcf9eba5dcf2de9f7d7d2f06f9a30da.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d55c2eb739f58ffe6f605a4b13dc4cbb.png)
简单的了解springboot的事件监听机制了,我们需要用它们做一些事情。
3 springboot流程分析
3.1 创建SpringApplication对象
![](https://i-blog.csdnimg.cn/blog_migrate/a26445e0d369cdfb2dee1ade0600f21a.png)
在debug形式下启动项目
![](https://i-blog.csdnimg.cn/blog_migrate/ebd7c20a8b2658fcc11ed8f16b1b53eb.png)
3.2执行run方法
public ConfigurableApplicationContext run(String... args) {
long startTime = System.nanoTime(); // 计时
DefaultBootstrapContext bootstrapContext = createBootstrapContext();
ConfigurableApplicationContext context = null;
configureHeadlessProperty();
// !!!获取所有的listener!
SpringApplicationRunListeners listeners = getRunListeners(args);
listeners.starting(bootstrapContext, this.mainApplicationClass);
try {
ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
// 环境准备
ConfigurableEnvironment environment = prepareEnvironment(listeners, bootstrapContext, applicationArguments);
// 环境信息准备
configureIgnoreBeanInfo(environment);
// 打印图标
Banner printedBanner = printBanner(environment);
// !!!IOC容器创建!
context = createApplicationContext();
context.setApplicationStartup(this.applicationStartup);
prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);
// 刷新 context
refreshContext(context);
afterRefresh(context, applicationArguments);
Duration timeTakenToStartup = Duration.ofNanos(System.nanoTime() - startTime);
if (this.logStartupInfo) {
new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), timeTakenToStartup);
}
listeners.started(context, timeTakenToStartup);
callRunners(context, applicationArguments);
}
catch (Throwable ex) {
handleRunFailure(context, ex, listeners);
throw new IllegalStateException(ex);
}
try {
Duration timeTakenToReady = Duration.ofNanos(System.nanoTime() - startTime);
listeners.ready(context, timeTakenToReady);
}
catch (Throwable ex) {
handleRunFailure(context, ex, null);
throw new IllegalStateException(ex);
}
return context;
}
重点代码:
获取所有的listener!
SpringApplicationRunListeners listeners = getRunListeners(args);
![](https://i-blog.csdnimg.cn/blog_migrate/85f19fc24fb0b9ea18a08392840e3849.png)
b. 环境准备
ConfigurableEnvironment environment = prepareEnvironment
c. 创建IoC容器
context = createApplicationContext();
d. 刷新IoC容器
refreshContext(context);
整个流程如下图所示
![](https://i-blog.csdnimg.cn/blog_migrate/5c52c515b0433781e69365fc94d573a3.png)