如何在SpringBoot上下文加载前执行可终止应用启动的代码?及现有实现失效的排查求助
我最近碰到了个头疼的问题:想在SpringBoot应用上下文加载前执行一段初始化代码(这段代码可能会直接终止应用启动),但试了好几种方案都没成功,实在摸不着头脑,来求助大家。
先说明下背景:这段代码是公共库的一部分,要被上百个服务引用,所以没办法直接放到主方法开头,必须通过Spring的扩展机制来实现。
我已经尝试了两种方案,但都失效了:
实现
SpringApplicationRunListener+spring.factories配置
我写了一个实现org.springframework.boot.SpringApplicationRunListener的类,然后在META-INF/spring.factories里配置了这个类的全限定名,但这个配置好像被完全忽略了,监听器里的代码根本没执行。实现
ApplicationListener<ApplicationStartingEvent>+@Component
这次我实现了ApplicationListener<ApplicationStartingEvent>,写了onApplicationEvent方法,还给类加了@Component注解,甚至加了构造方法来验证组件是否被加载——结果构造方法确实被调用了,但onApplicationEvent方法从来没触发过。
更新:我把具体的代码和配置贴出来,方便大家排查:
1. spring.factories配置(Jar包内路径为META-INF/spring.factories,完整类名已省略)
org.springframework.boot.SpringApplicationRunListeners=com.....secrets.init.StartupListener2
2. 对应的监听器类
package com...secrets.init; import org.springframework.boot.ConfigurableBootstrapContext; import org.springframework.boot.SpringApplicationRunListener; import org.springframework.stereotype.Component; @Component public class StartupListener2 implements SpringApplicationRunListener { public StartupListener2() { System.out.println("StartupListener2 bean created"); } public void starting(ConfigurableBootstrapContext bootstrapContext) { System.out.println("Application is starting"); } }
注:我知道给SpringApplicationRunListener实现类加@Component注解其实没必要,这是第一次尝试失败后抱着试试的心态加上的,结果还是没用。
有没有大佬能帮我看看哪里错了?
备注:内容来源于stack exchange,提问作者David M. Karr

