Spring 应用无法启动,报无法读取配置文件错误

公司研发部门提供了一个组件包,该包在启动的时候会根据配置文件创建 MQ 消费线程,消费指定消息。集成到项目中后项目完全无法启动,报取不到配置的错误。经排查,
配置文件的配置是正确的,但在启动类中就是读不到相关配置。

1. 出现多个 Application started with classpath 日志.

通过仔细阅读日志输出内容,发现输出多两个 Application started with classpath 的日志,怀疑是 Spring 启动了多个 Context。

由于项目中引入了 Spring Cloud,所以这个多出来的 context 日志应该是 Spring Cloud 启动的 Bootstrap Context,这个应该是正常的。

2. 重复的 ClassPathBeanDefinitionScanner 扫描.

继续看日志发现有部分类的 ClassPathBeanDefinitionScanner 扫描日志重复。可能是有多个 @ComponentScan 之类的注解触发了多次某个包的扫描。
最后确实发现引入的组件包有 RunServer 的测试启动类,该类重复配置了扫描。

重复扫描应该不会影响处理结果的。

3. Feign Context.

Spring Boot 启动的时候,feign 启动了内嵌的 Spring Context,并产生了 ContextRefreshedEvent 事件,该事件被传递到父 Context (Application Context)。

该组件是基于 ContextRefreshedEvent 事件初始化,预计是在容器创建完成后才被处理,然而 feign 内置的 context 导致提前调用,此时 Properties
还未处理,最终会因注入配置失败而启动失败。

4. 解决

可以考虑实现接口 SmartInitializingSingletonafterSingletonsInstantiated 方法进行组件初始化,该方法会在所有的 Singleton Bean 初始化完后调用。

Spring 应用无法启动,报无法读取配置文件错误

https://blog.imoe.tech/2020/06/02/33-app-errors-in-multiple-spring-context/

作者

Jakes Lee

发布于

2020-06-02

更新于

2021-11-18

许可协议

评论