SpringBoot监听机制

"SpringBoot学习记录"

Posted by yangsir on December 6, 2023

“Yeah It’s on. ”

SpringBoot 监听机制

Java 监听机制

SpringBoot的监听机制,其实就是对Java提供的事件监听机制的封装。

Java中的事件监听机制定义了以下几个角色:

1、事件:Event,继承java.util.EventObject类对象

2、事件源:Source,任意对象Object

3、监听器:Listener,实现java.util.EventListener接口的对象

SpringBoot 监听机制

SpringBoot在项目启动时,会对几个监听器进行回调,我们可以实现这些监听器接口,在项目启动时完成一些操作。

1
2
3
4
5
6
7
8
9
//ApplicationContextInitializer

@Component
public class MyApplicationContextlnitializer implements ApplicationContextInitializer{
    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        System.out.println("ApplicationContextInitializer....initialize run");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
//SpringApplicationRunListener

@Component
public class MySpringApplicationRunListener implements SpringApplicationRunListener {
    @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 contextPrepared(ConfigurableApplicationContext context) {
        System.out.println("contextPrepared");
    }

    @Override
    public void contextLoaded(ConfigurableApplicationContext context) {
        System.out.println("contextLoaded");
    }

    @Override
    public void started(ConfigurableApplicationContext context, Duration timeTaken) {
        System.out.println("started");
    }

    @Override
    public void started(ConfigurableApplicationContext context) {
        SpringApplicationRunListener.super.started(context);
    }

    @Override
    public void ready(ConfigurableApplicationContext context, Duration timeTaken) {
        System.out.println("ready");
    }

    @Override
    public void running(ConfigurableApplicationContext context) {
        SpringApplicationRunListener.super.running(context);
    }

    @Override
    public void failed(ConfigurableApplicationContext context, Throwable exception) {
        System.out.println("failed");
    }
}
1
2
3
4
5
6
7
8
9
10
//CommandLineRunner

@Component
public class MyCommandLineRunner implements CommandLineRunner {
    @Override
    public void run(String... args) throws Exception {
        System.out.println("CommandLineRunner...run");
    }
}

1
2
3
4
5
6
7
8
9
//ApplicationRunner

@Component
public class MyApplicationRunner implements ApplicationRunner {
    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("ApplicationRunner...run");
    }
}

image-20231203194709693

实验说明,只有最后两个被执行了

原因:SpringApplicationRunListener、ApplicationContextInitializer还需要进一步配置

在resources下新建META-INF/spring.factories

image-20231206085243392

ApplicationContextInitializer成功运行

SpringApplicationRunListener报错 非法参数异常

MySpringApplicationRunListener加构造方法

1
2
3
public MySpringApplicationRunListener(SpringApplication application, String[] args){

}

最终运行效果

image-20231206090329765