bal*_*teo 21 spring spring-profiles
我只是想知道在指定多个Spring活动配置文件时优先顺序是什么.
假设我希望default配置文件处于活动状态,但是dev当有几个相同的元素(例如bean)可供选择但具有不同的配置文件时,配置文件会覆盖它...
比方说,我有两个PropertySourcesPlaceholderConfigurerbean配置"default"和"dev"值环境配置文件.
如果我使用以下配置文件激活: -Dspring.profiles.active="default,dev"
将dev配置文件覆盖default吗?
如果不是,如何实现上述行为?
sup*_*rEb 17
spring.profiles.active系统属性中的配置文件的顺序无关紧要."优先级"由bean的声明顺序定义,包括特定于配置文件的bean,最后一个bean定义获胜.
使用你的例子,如果-Dspring.profiles.active="default,dev"使用了props,那么default配置文件中的bean 将在这里使用,因为它是该bean的最后一个活动定义:
<beans profile="dev">
<bean id="props" class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
<property name="location" value="classpath:META-INF/dev.properties"/>
</bean>
</beans>
<beans profile="default">
<bean id="props" class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
<property name="location" value="classpath:META-INF/default.properties"/>
</bean>
</beans>
Run Code Online (Sandbox Code Playgroud)
反转bean的顺序,然后使用dev版本,无论配置文件的排序方式如何spring.profiles.active.
请注意,我没有使用,<context:property-placeholder/>因为它不允许您显式指定bean id,因此我不确定如果使用多个行为,它会表现出什么样的行为.我想这些属性将被合并,因此两者定义的属性将使用最后一个定义,但特定于每个文件的属性将保持不变.
否则,根据我的经验,您通常会按以下顺序定义bean:
这样,如果与其他配置文件结合使用,测试配置文件bean将获胜; 否则,您将根据配置文件使用特定于环境的bean或默认Bean.
Rhu*_*arb 15
我必须通过实验来说服自己。
从Spring Initializr创建最简单的 Spring Boot 应用程序
然后将 3 个属性文件添加到资源目录(第一个已经存在但为空)
# application.properties
foo=foo in application.properties
bar=bar in application.properties
baz=baz in application.properties
Run Code Online (Sandbox Code Playgroud)
# application-foobar.properties
foo=foo in foobar override properties
bar=bar in foobar override properties
Run Code Online (Sandbox Code Playgroud)
# application-barbaz.properties
bar=bar in barbaz override properties
baz=bar in barbaz override properties
Run Code Online (Sandbox Code Playgroud)
然后我添加了这个 @Config 类以在启动时运行:
package com.example.profilesexperiment;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
@Configuration
class StartupConfig {
@Autowired
private Environment environment;
@Value("${foo}")
private String foo;
@Value("${bar}")
private String bar;
@Value("${baz}")
private String baz;
@Bean
CommandLineRunner startup() {
return args -> {
System.err.println("Active profiles: " + String.join(", ", environment.getActiveProfiles()));
System.err.println("Foo = " + foo);
System.err.println("Bar = " + bar);
System.err.println("Baz = " + baz);
};
}
}
Run Code Online (Sandbox Code Playgroud)
然后我用不同的配置文件组合运行它。您可以自己尝试一下,但以下是一些输出:
java -Dspring.profiles.active=foobar -jar target/profiles-experiment-0.0.1-SNAPSHOT.jar
Active profiles: foobar
Foo = foo in foobar override properties
Bar = bar in foobar override properties
Baz = baz in application.properties
Run Code Online (Sandbox Code Playgroud)
java -Dspring.profiles.active=foobar,barbaz -jar ...
Active profiles: foobar, barbaz
Foo = foo in foobar override properties
Bar = bar in barbaz override properties
Baz = bar in barbaz override properties
Run Code Online (Sandbox Code Playgroud)
java -Dspring.profiles.active=barbaz,foobar -jar ...
Active profiles: barbaz, foobar
Foo = foo in foobar override properties
Bar = bar in foobar override properties
Baz = bar in barbaz override properties
Run Code Online (Sandbox Code Playgroud)
哦,还有:非重写属性合并到一个大的快乐属性集(这就是我来这里搜索的原因)
mom*_*bip 11
最后一个定义获胜。我记住了,但是:
请务必记住,如果您在 jar 资源中有一些 application.properties 的默认内容,那么该资源内容将覆盖不太重要的配置文件(在 之前定义的其他配置文件spring.profiles.active)的外部内容中的条目。
示例配置文件: spring.profiles.active=p1,p2,p3
Jar 资源中的文件:application-p1.properties和application-p3.properties
外部文件:application-p1.properties和application-p2.properties
最终顺序将是(最后获胜者):
application.propertiesapplication.propertiesapplication-p1.propertiesapplication-p1.propertiesapplication-p2.propertiesapplication-p3.properties- 这就是诀窍!这将使用 p3 的资源版本中的值覆盖 p1 和 p2 的外部文件中定义的属性application-p3.properties所以请记住,最后的胜利而且资源在外部之前
superEB 是正确的,配置文件的顺序对 bean 无关紧要,声明顺序在那里更重要,但请记住,如果您使用基于配置文件的配置文件,顺序很重要!
| 归档时间: |
|
| 查看次数: |
23306 次 |
| 最近记录: |