springBoot的自定义监听器为什么要配置有参构造,而自定义初始化不需要呢?

springBoot的自定义监听器为什么要配置有参构造,而自定义初始化不需要呢?

/**
 * 自定义的初始化器 ,SpingBoot启动后就会被初始化
 */
public class InitializerTestBoot implements ApplicationContextInitializer {
    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        System.out.printf("zhh 自定义的初始化器");
    }
}

public class ListenerTest implements SpringApplicationRunListener, Ordered {
    private final SpringApplication application;
    private final String[] args;

    public ListenerTest(SpringApplication application, String[] args) {
        this.application =application;
        this.args =args;
    }


    @Override
    public int getOrder() {
        return -1;
    }

    @Override
    public void starting(ConfigurableBootstrapContext bootstrapContext) {
        System.out.println("zhh Listener监听启动");
    }

    @Override
    public void environmentPrepared(ConfigurableBootstrapContext bootstrapContext, ConfigurableEnvironment environment) {
        System.out.println("环境准备,正在读取配置文件....");
    }
}

ListenerTest 如果i没有有参构造就会报错

Exception in thread "main" java.lang.IllegalArgumentException: Cannot instantiate interface org.springframework.boot.SpringApplicationRunListener : com.zhang.ListenerTest
    at org.springframework.boot.SpringApplication.createSpringFactoriesInstances(SpringApplication.java:449)
    at org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.java:431)
    at org.springframework.boot.SpringApplication.getRunListeners(SpringApplication.java:419)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:297)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292)
    at com.zhang.RedisSpringbootApplication.main(RedisSpringbootApplication.java:10)
Caused by: java.lang.NoSuchMethodException: com.zhang.ListenerTest.(org.springframework.boot.SpringApplication, [Ljava.lang.String;)
    at java.lang.Class.getConstructor0(Class.java:3082)
    at java.lang.Class.getDeclaredConstructor(Class.java:2178)
    at org.springframework.boot.SpringApplication.createSpringFactoriesInstances(SpringApplication.java:444)
    ... 6 more

可是它两走的都是getSpringFactoriesInstances同一个方法呀

在Spring Boot中,自定义监听器(Listener)和自定义初始化(Initializer)都是基于事件监听机制实现的。

自定义监听器通常需要在应用程序启动时注册,并在某些事件发生时触发回调函数进行处理。因此,为了注册监听器,需要在应用程序的配置文件中添加配置,而配置中需要指定监听器的类名和实例化时需要传递的参数。这就是为什么自定义监听器需要配置有参构造函数的原因。

相比之下,自定义初始化是在Spring容器启动时进行的。在Spring容器启动过程中,会自动检测并执行所有实现了org.springframework.context.ApplicationContextInitializer接口的初始化器。由于初始化器的执行是由Spring容器控制的,因此无需在配置文件中指定初始化器的类名和参数。而是通过在Spring配置文件中进行bean定义的方式来指定初始化器的类名和参数。