问题背景
我们项目的配置文件一直是通过Apollo进行管理,但是近期由于某些特殊的部署需求,需要使用K8S的原生对象来获取配置,如此一来的话,就需要使用环境变量spring.config.location来指定application.properties
文件的路径,以便动态的获取配置。
说明:项目是一个dubbo项目,配置文件中主要包括一些基础组件的配置、以及dubbo相关的配置。
这时候问题来了,在所有配置及代码都没有变化的情况下,如果不指定环境变量使用本地的application.properties
,则没有异常任何,项目可以正常启动,但是一但通过spring.config.location 来加载配置,则项目会直接启动失败,并报如下异常:
NoSuchBeanDefinitionException
,这个异常前期误导我不少时间,它一般是Spring在容器初始化时,进行依赖注入的时候没有找到对应的bean定义,也就意味着这个bean压根没有被注册到BeanFactory中,这就很奇怪,只是配置文件的加载方式不同,为何会影响到bean的注册?
过程
找不到bean,最常见的问题有两种:要么是配置问题,比如扫描的包配置错误、配置未生效等。要么就是IoC容器的问题,存在多个容器ÿ