概述
文章目录
- 前言
- Java中的事件监听机制:
- Springboot监听机制
- 通过案例学习Springboot监听机制
- 小例子
- 总结
- SpringApplicationRunListener 源码分析
前言
Srpingboot的监听,实际是对Java提供的事件监听机制的封装。
Java中的事件监听机制:
- 事件:Event,继承java.util.EventObject类的对象
- 事件源: Source,任何对象Object
- 监听器: Listener,实现java.util.EventListener接口的对象
Springboot监听机制
Springboot在项目启动时,会对几个监听器进行回调,我们可以实现这些监听器接口,在项目启动时完成一些操作。
ApplicationContextInitializer
SpringApplicationRunListener
CommandLineRunner
ApplicationRunner
通过案例学习Springboot监听机制
小例子
-
创建springboot模块(不需要选择任何组件)
这里的springboot版本是2.6.6,不同版本代码可能会有些许差异。 -
分别实现这四个接口
package com.it2.springbootlistener02.listener;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.stereotype.Component;
/**
* 在图标大于后就会被执行,通常用于检测资源是否存在
*/
public class MyApplicationContextInitializer implements ApplicationContextInitializer {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
System.out.println("MyApplicationContextInitializer...initialize");
}
}
package com.it2.springbootlistener02.listener;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import java.util.Arrays;
/**
* 当项目启动后执行run方法,可以用于缓存预热
*/
@Component
public class MyApplicationRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("MyApplicationRunner... run");
System.out.println(Arrays.asList(args.getSourceArgs()));
}
}
package com.it2.springbootlistener02.listener;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import java.util.Arrays;
@Component
public class MyCommandLineRunner implements CommandLineRunner {
/**
* program arguments
* @param args
* @throws Exception
*/
@Override
public void run(String... args) throws Exception {a
System.out.println("MyCommandLineRunner ... run");
System.out.println(Arrays.asList(args));
}
}
package com.it2.springbootlistener02.listener;
import org.springframework.boot.ConfigurableBootstrapContext;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.SpringApplicationRunListener;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;
import java.time.Duration;
public class MySpringApplicationRunListener implements SpringApplicationRunListener {
public MySpringApplicationRunListener(SpringApplication application, String[] args) {
}
@Override
public void starting(ConfigurableBootstrapContext bootstrapContext) {
System.out.println("starting... 启动中");
}
@Override
public void environmentPrepared(ConfigurableBootstrapContext bootstrapContext, ConfigurableEnvironment environment) {
System.out.println("environmentPrepared...环境对象开始准备");
}
@Override
public void started(ConfigurableApplicationContext context, Duration timeTaken) {
System.out.println("starting... 启动完成");
}
@Override
public void ready(ConfigurableApplicationContext context, Duration timeTaken) {
System.out.println("ready...准备");
}
@Override
public void contextPrepared(ConfigurableApplicationContext context) {
System.out.println("contextPrepared...上下文对象开始准备");
}
@Override
public void contextLoaded(ConfigurableApplicationContext context) {
System.out.println("contextLoaded...上下文对象开始加载");
}
@Override
public void started(ConfigurableApplicationContext context) {
System.out.println("started...上下文对象加载完成");
}
@Override
public void running(ConfigurableApplicationContext context) {
System.out.println("running...启动完成,开始运行");
}
@Override
public void failed(ConfigurableApplicationContext context, Throwable exception) {
System.out.println("failed...启动失败");
}
}
-
运行代码。发现只有两个自定义的MyApplicationRunner和MyCommandLineRunner被执行了。
-
MyApplicationRunner和MyCommandLineRunner的实现类参数是什么?
这里输出一下args,在运行时给传入参数
在添加参数后,再次运行。发现其实它是项目运行时传入的program arguments参数。
总结:
这里我们可以知道它们在项目启动后运行,我们可以通过实现这两个接口中的任意一个去做一些在项目启动后需要做的事情,比如数据预热。 -
另外两个类 (MyApplicationContextInitializer和MySpringApplicationRunListener)没有被执行。这里我们定义一个META-INF/spring.factories,(这样可以被EnableAutoConfiguration扫描到)
org.springframework.context.ApplicationContextInitializer=
com.it2.springbootlistener02.listener.MyApplicationContextInitializer
org.springframework.boot.SpringApplicationRunListener=
com.it2.springbootlistener02.listener.MySpringApplicationRunListener
- 再次运行。发现MyApplicationContextInitializer和MySpringApplicationRunListener的打印也输出了。
总结
-
MyApplicationRunner 能做什么?
通过日志打印,我们可以知道在项目启动结束后,ApplicationRunner的代码被执行,
我们可以将一些需要在项目启动后被执行的事情用它来执行。比如数据预热。 -
MyCommandLineRunner 能做什么?
CommandLineRunner和ApplicationRunner的日志打印相邻,都在项目启动完成后被执行,使用它们两者具有都可以完成相同的事情。比如数据预热。 -
MyApplicationContextInitializer的打印位置我们发现它是在logo打印后的第一行,它能做什么用呢?
ApplicationContextInitializer 可以做预环境检测。 -
SpringApplicationRunListener的日志打印这么长,它能干什么?
SpringApplicationRunListener的声明周期比较长,它在项目开头和启动完成都有日志输出,声明周期贯穿了整个启动过程,所以能做的事情就比较多了。
SpringApplicationRunListener 源码分析
最后
以上就是烂漫火龙果为你收集整理的springboot进阶(7):springboot监听机制前言通过案例学习Springboot监听机制SpringApplicationRunListener 源码分析的全部内容,希望文章能够帮你解决springboot进阶(7):springboot监听机制前言通过案例学习Springboot监听机制SpringApplicationRunListener 源码分析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复