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定义的方式来指定初始化器的类名和参数。