我已经看到许多有关Spring Boot外部配置的问题,特别是将application.properties
文件外部化,但是没有找到关于外部化application.properties文件的属性值是否应为合并或类路径上的整个.properties文件,应使用外部文件覆盖。
在最近将应用程序升级到Spring Boot 2.2.1-RELEASE版本之后,需要使用spring.main.allow-bean-definition-overriding=true
属性启用bean覆盖,该属性在类路径的application.properties文件中设置。由于我们要使用外部application.properties文件,因此我创建了一个没有上述属性的名称(相同名称),并在IntelliJ中将其加载了以下属性:
java -jar appName.jar --spring.config.location="C:\Users\User\Downloads\application.properties"
出现错误,好像外部props文件完全覆盖了classpath文件,而没有在classpath文件中查找提到的属性,而没有使用classpath application.properties
中缺少的属性:
***************************
APPLICATION FAILED TO START
***************************
Description:
The bean 'userRepository' could not be registered. A bean with that name has already been defined and overriding is disabled.
Action:
Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true
在将bean覆盖属性添加到外部application.properties文件之后,但又从类路径中将其删除了,错误消失了。
在Spring文档中,明确指出:
Spring Boot使用一个非常特殊的PropertySource顺序,该顺序旨在允许合理的值覆盖。按以下顺序考虑属性:
...
- 打包的jar之外的应用程序属性(application.properties和YAML变体)。
- 打包在jar中的应用程序属性(application.properties和YAML变体)。
在使用IntelliJ和打包的jar对其进行测试之后,这两种方法都表现出相同的效果:似乎整个文件都被覆盖并且值没有合并,而仅从外部属性文件中加载。我的问题是,这是预期的行为还是我错过了某些东西?
编辑:使用jar测试了行为