沈山南丶 2023-03-07 17:03 采纳率: 50%
浏览 23
已结题

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.<init>(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同一个方法呀

  • 写回答

1条回答 默认 最新

  • 云飞 ° 2023-03-07 17:11
    关注

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

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

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

    本回答被专家选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 3月19日
  • 专家已采纳回答 3月11日
  • 创建了问题 3月7日

悬赏问题

  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等
  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行
  • ¥20 测距传感器数据手册i2c