springboot自定义监听器SpringApplicationRunListener的坑

本文介绍了解决在Spring Boot应用中自定义SpringApplicationRunListener出现的IllegalArgumentException异常的方法。通过为自定义监听器添加构造方法并移除@Component注解,可以有效避免此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Exception in thread "main" java.lang.IllegalArgumentException: Cannot instantiate interface org.springframework.boot.SpringApplicationRunListener : com.itheima.springbootlistener.listener.MySpringApplicationRunListener
    at org.springframework.boot.SpringApplication.createSpringFactoriesInstances(SpringApplication.java:467)
    at org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.java:449)
    at org.springframework.boot.SpringApplication.getRunListeners(SpringApplication.java:437)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:316)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1309)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1298)
    at com.itheima.springbootlistener.SpringbootListenerApplication.main(SpringbootListenerApplication.java:10)
Caused by: java.lang.NoSuchMethodException: com.itheima.springbootlistener.listener.MySpringApplicationRunListener.<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:462)
    ... 6 more

解决方案:首先看下SpringApplicationRunListener内部提供的实现类,其中第一个是springboot自己提供的实现类,第二个是我自定义的实现类

springboot自己提供了EventPublishingRunListener的实现类,该实现类中加了一个构造方法,故自定义监听器中加一个构造器就ok了

注意:会有警告,只要去掉@Component注解就可以了

启动:启动成功

 

### Spring Boot监听器的工作过程和实现方式 #### 听器初始化阶段 在`SpringApplication#run`方法执行期间,会创建并初始化一系列监听器实例。默认情况下,这些监听器是`EventPublishRunListener`类型的对象,它们被存储在一个名为listeners的数组中[^4]。 ```java // 获取 SpringApplicationRunListener 实例数组,默认获取的是 EventPublishRunListener SpringApplicationRunListeners listeners = this.getRunListeners(args); ``` #### 监听器启动通知 一旦监听器准备就绪,在应用程序生命周期的不同关键时刻,将会触发相应的事件来通知所有的监听器。例如,在应用刚开始启动的时候: ```java // 启动监听,重点关注此行代码 listeners.starting(bootstrapContext, this.mainApplicationClass); ``` 这一步骤确保了所有注册过的监听器都能接收到关于程序状态变化的通知,并有机会做出响应动作。 #### 应用上下文刷新 当进入实际的应用上下文构建环节时,最终会调用到`AbstractApplicationContext.refresh()`方法。在此过程中间发生的任何重要变动都会再次广播给之前提到的那些监听者们[^2]。 #### 定制化扩展 除了内置的支持外,开发人员还可以自定义自己的监听组件。只需要简单地继承特定接口(比如`ApplicationListener<EventType>`),就可以轻松接入整个框架之中,从而实现更加灵活的功能需求。 对于希望进一步深入了解这部分内容的人来说,可以查看官方文档或者源码中的具体实现细节;另外也可以尝试编写一些简单的例子来进行实践操作,加深理解。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值