Spring 脚 application.properties 生命周期
Spring Boot application.properties lifecyle
我有一个大型 Spring 网络应用程序,可以追溯到几年前。我需要将其更新为 Spring Boot(企业要求)。我进展顺利 - 它开始了 (!),尽管注入的属性存在一些问题,这会导致应用程序失败。
具体来说,每个配置文件有三个巨大的配置文件,例如qa_config.properties
、qa_ehcache.xml
、qa_monitoring.properties
。目前我只关心 qa_config.properties
,我已将其重命名为 Spring Boot 的首选名称,application-qa.properties
和 application-qa_monitoring.properties
该应用程序有许多用 @Named
注释的 classes(来自 javax.ws.rs-api ),它们很早就加载了 - 太早了,我需要在构造函数中注入属性:
package com.domain.app;
import org.springframework.beans.factory.annotation.Value;
import javax.inject.Named;
@Named
public class Foo {
// Cant use @Value here, it is not yet in the context
protected String bar; // lives in application-qa.properties
protected String qux; // lives in application-qa_monitoring.properties
public Foo(@Value("${application.property.named.bar}") String bar,
@Value("${monitoring.property.named.qux}") String qux) {
this.bar = bar;
this.qux = qux;
doSomeWork();
}
}
属性文件:
#application-qa.properties
application.property.named.bar=something
和
#application-qa_monitoring.properties
monitoring.property.named.qux=another_thing
我的问题:我想尽快在上下文中同时使用 application-qa.properties
和 application-qa_monitoring.properties
,并且 在 之前 @Named
classes 已加载。
为了实现这一点,我运行使用 qa
的活动配置文件连接应用程序,它成功地将那组属性添加到上下文中。
我将这一行添加到 application.properties
文件,以确保加载其他属性:
spring.profiles.include=${spring.profiles.active}_monitoring.properties
当我 运行 Spring 启动应用程序时,输出告诉我
The following profiles are active: qa_monitoring.properties,qa
调试Foo
class时,bar
的值是正确的
但是,qux
的值为空。
我是否遗漏了有关属性文件加载顺序的信息?我本以为 application.properties
中的 include
行足以 "flatten" 这两个文件很早就足够了,如果一个在上下文中,那么两个文件都应该可用吗?
我可以做的只是将两个属性文件中的所有变量合并为一个 application-qa.properties
,但如果可能的话,我希望将它们分开并尽可能接近原始结构尽可能。
您遇到的问题是因为您在 qux 值的 @Value 注释中使用了文字值而不是查找键。
替换
public Foo(@Value("${application.property.named.bar}") String bar,
@Value("monitoring.property.named.qux") String qux) {
与
public Foo(@Value("${application.property.named.bar}") String bar,
@Value("${monitoring.property.named.qux}") String qux) {
它应该可以工作。
感谢 pvpkiran 和 Andy Brown。
我的 application.properties 文件应该读取
spring.profiles.include=${spring.profiles.active}_monitoring
即,只需添加另一个 profile
,在本例中 qa_monitoring
- Spring 会自动添加 application-
前缀和 .properties suffix
我有一个大型 Spring 网络应用程序,可以追溯到几年前。我需要将其更新为 Spring Boot(企业要求)。我进展顺利 - 它开始了 (!),尽管注入的属性存在一些问题,这会导致应用程序失败。
具体来说,每个配置文件有三个巨大的配置文件,例如qa_config.properties
、qa_ehcache.xml
、qa_monitoring.properties
。目前我只关心 qa_config.properties
,我已将其重命名为 Spring Boot 的首选名称,application-qa.properties
和 application-qa_monitoring.properties
该应用程序有许多用 @Named
注释的 classes(来自 javax.ws.rs-api ),它们很早就加载了 - 太早了,我需要在构造函数中注入属性:
package com.domain.app;
import org.springframework.beans.factory.annotation.Value;
import javax.inject.Named;
@Named
public class Foo {
// Cant use @Value here, it is not yet in the context
protected String bar; // lives in application-qa.properties
protected String qux; // lives in application-qa_monitoring.properties
public Foo(@Value("${application.property.named.bar}") String bar,
@Value("${monitoring.property.named.qux}") String qux) {
this.bar = bar;
this.qux = qux;
doSomeWork();
}
}
属性文件:
#application-qa.properties
application.property.named.bar=something
和
#application-qa_monitoring.properties
monitoring.property.named.qux=another_thing
我的问题:我想尽快在上下文中同时使用 application-qa.properties
和 application-qa_monitoring.properties
,并且 在 之前 @Named
classes 已加载。
为了实现这一点,我运行使用 qa
的活动配置文件连接应用程序,它成功地将那组属性添加到上下文中。
我将这一行添加到 application.properties
文件,以确保加载其他属性:
spring.profiles.include=${spring.profiles.active}_monitoring.properties
当我 运行 Spring 启动应用程序时,输出告诉我
The following profiles are active: qa_monitoring.properties,qa
调试Foo
class时,bar
的值是正确的
但是,qux
的值为空。
我是否遗漏了有关属性文件加载顺序的信息?我本以为 application.properties
中的 include
行足以 "flatten" 这两个文件很早就足够了,如果一个在上下文中,那么两个文件都应该可用吗?
我可以做的只是将两个属性文件中的所有变量合并为一个 application-qa.properties
,但如果可能的话,我希望将它们分开并尽可能接近原始结构尽可能。
您遇到的问题是因为您在 qux 值的 @Value 注释中使用了文字值而不是查找键。
替换
public Foo(@Value("${application.property.named.bar}") String bar,
@Value("monitoring.property.named.qux") String qux) {
与
public Foo(@Value("${application.property.named.bar}") String bar,
@Value("${monitoring.property.named.qux}") String qux) {
它应该可以工作。
感谢 pvpkiran 和 Andy Brown。
我的 application.properties 文件应该读取
spring.profiles.include=${spring.profiles.active}_monitoring
即,只需添加另一个 profile
,在本例中 qa_monitoring
- Spring 会自动添加 application-
前缀和 .properties suffix