一、问题介绍
今天在开发项目时,采用@Value("${aa.bb: http://localhost:8081/url}") 配置了请求地址默认值,方便本地调试。发到测试环境时,在配置中心配置了aa.bb:http://xxxxxx/url 。因为之前有过经验,此时配置中心的值会覆盖本地默认值。但是实际在服务器测试时发现配置中心的配置没有生效。于是有了下面的问题分析。
二、@value值注入流程图
这里放一张自己为了理清@value值注入过程画的图。具体流程不讲了,要写太多。主要的类和方法已提供。欢迎交流,如果发现问题也请指教。
三、问题原因分析
对比了原项目。发现原因如下:
1、低版本的springframework例如4.3.11,@value属性注入会走两个resolver;resolver1是spring-beans下的PropertyPlaceholderConfigurer内部类(图中橙色字第一个);resolver2是spring-context的PropertySourcesPlaceholderConfigurer类。(橙色第二个)。
2、高版本的springframework例如5.2.10,废弃了resolver1中spring-beans下的PropertyPlaceholderConfigurer内部类。从而属性注入只走了spring-context下的。
3、配置中心没有覆盖本地默认值,是由于低版本在走完resolver1,此时返回了配置的默认值,这个默认值不带${}符号。走到resolver2时,判断是否以 '${' 开头,以 '}' 结尾。否->直接返回了该默认值。
四、问题解决
1、分析项目是否可以提升springframework版本
2、删除本地默认配置
3、是否可以自定义两个resolver的执行顺序还没看,正在看。有知道的朋友可以交流交流