当必须在不同配置中使用相同的应用程序代码时,外部化Spring Boot应用程序属性会很有用。 如果spring.config.location
配置远离源代码(无论如何spring.config.location
被认为是最佳实践), spring.config.location
环境属性可以用于指向带有属性文件的目录位置。 另一方面, spring.config.name
可用于更改默认为application
的属性文件的基本名称。 该文档显示为: 如果您不喜欢 application.properties作为配置文件名,则可以切换到另一个 。 但是在什么情况下可以使用spring.config.name
。
(潜在)问题
提供spring.config.location
的方法之一是使用环境变量: SPRING_CONFIG_LOCATION
。 将Spring Boot应用程序部署到Tomcat服务器时,这可以被认为是有用的。 当Spring Boot应用程序启动时,它将从SPRING_CONFIG_LOCATION
目录中选择application.properties
(具有特定于配置文件的属性文件)。
但是,当将多个Spring Boot应用程序部署到同一Tomcat服务器时会发生什么呢?
在这种情况下,我们可能会期望某些意外的行为,因为其他应用程序也会从SPRING_CONFIG_LOCATION
目录中选择该application.properties
– SPRING_CONFIG_LOCATION
;如果这些应用程序不同,我们可能会遇到麻烦。
(潜在)解决方案
解决此问题的方法之一是在每个应用程序中更改配置基本名称。
可以使用spring.config.name
属性在servlet初始化程序中以编程方式完成此操作:
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;public class ServletInitializer extends SpringBootServletInitializer {@Overrideprotected SpringApplicationBuilder configure(SpringApplicationBuilder application) {return application.properties("spring.config.name:my-app-1").sources(MyApiApplication.class);}}
启动应用程序时,Spring Boot会期望存在my-app-1.properties
(具有特定于配置文件的变体,例如my-app-1-test.properties
)。 这样,我们可以使用外部化配置轻松地将多个应用程序部署到同一Tomcat服务器:
/data/config/my-app-1.properties
/data/config/my-app-1-test.properties
/data/config/my-app-2.properties
/data/config/my-app-2-test.properties
最后的想法
硬编码配置不是最佳解决方案,但是在某些情况下,没有比这更好的方法了。
翻译自: https://www.javacodegeeks.com/2017/10/spring-boot-spring-config-name-case-study.html