spring.profiles.active에 의해 설정된 여러 Spring의 환경 프로파일이 있는 경우 우선순위는 무엇입니까?
스프링 활성 프로필이 여러 개 지정되었을 때 우선 순위가 어떻게 되는지 궁금합니다.
내가 원한다고 말해줘요.default
프로필은 활성화되지만dev
선택할 수 있는 동일한 요소(예: 콩)가 여러 개 있지만 프로필이 다른 경우 프로필을 재정의합니다.
예를 들어, 나는 두 개가 있습니다.PropertySourcesPlaceholderConfigurer
로 구성된 콩"default"
그리고."dev"
환경 프로파일을 중요시합니다.
다음 프로필 활성화를 사용하는 경우:-Dspring.profiles.active="default,dev"
윌더dev
프로필 재정의default
하나?
그렇지 않다면 위의 동작을 어떻게 달성할 수 있습니까?
의 프로파일 순서spring.profiles.active
시스템 속성은 중요하지 않습니다."우선 순위"는 프로필에 특정한 콩을 포함한 콩의 선언 순서에 의해 정의되며 마지막 콩 정의가 승리합니다.
당신의 예를 사용하면,-Dspring.profiles.active="default,dev"
사용된 경우,props
에 참가하고 있는default
프로파일은 단순히 콩의 마지막 활성 정의이기 때문에 여기에 사용될 것입니다.
<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>
원두의 순서를 거꾸로 하고, 그리고 나서,dev
프로파일 순서에 관계없이 버전이 사용됩니다.spring.profiles.active
.
사용하지 않은 알림<context:property-placeholder/>
빈 ID를 명시적으로 지정할 수 없기 때문에 둘 이상을 사용할 경우 어떤 동작이 나타날지 잘 모르겠습니다.속성이 병합되어 양쪽에서 정의한 속성은 마지막 정의를 사용하지만 각 파일에 고유한 속성은 그대로 유지됩니다.
그렇지 않으면, 제 경험상, 당신은 일반적으로 콩을 다음과 같은 순서로 정의할 것입니다.
- 프로파일에 특정되지 않은 "기본" 빈 정의
- 환경별 프로필에서 빈 정의 재정의
- 테스트별 프로필에서 빈 정의 재정의
이렇게 하면 다른 프로파일과 함께 사용할 경우 테스트 프로파일 콩이 승리합니다. 그렇지 않으면 환경별 콩을 사용하거나 프로파일에 기반한 기본 콩을 사용합니다.
마지막 정의가 승리합니다.염두에 두고 있지만,
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.properties
application.properties
- 자원
application-p1.properties
application-p1.properties
application-p2.properties
- 관리
application-p3.properties
여기서 비결이 있습니다! 이것은 p1 및 p2의 외부 파일에 정의된 속성을 p3의 리소스 버전 값으로 덮어씁니다. application-p3.properties
따라서 마지막으로 승리할 뿐만 아니라 리소스가 외부 리소스 바로 앞에 있다는 것을 기억하십시오.
저는 제 자신을 납득시키기 위해 실험을 해야 했습니다.
Spring Initializr에서 가장 단순한 Spring Boot 애플리케이션 생성
그런 다음 리소스 dir에 속성 파일 3개를 추가했습니다(첫 번째 파일은 이미 있지만 비어 있음).
# application.properties
foo=foo in application.properties
bar=bar in application.properties
baz=baz in application.properties
# application-foobar.properties
foo=foo in foobar override properties
bar=bar in foobar override properties
# application-barbaz.properties
bar=bar in barbaz override properties
baz=bar in barbaz override properties
그런 다음 시작 시 실행할 @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);
};
}
}
그런 다음 다른 프로필 조합으로 실행했습니다.직접 시도해 볼 수 있지만 다음은 몇 가지 결과입니다.
막노동을 하는 사람
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
푸바와 바바즈
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
바바즈와 후바
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
평결: 분명히, 마지막 한 명이 승리합니다!
아, 그리고 또한: 재정의되지 않은 속성이 하나의 큰 행복 속성 집합으로 병합됩니다(이것이 제가 여기서 검색하게 된 이유입니다).
superEB가 맞습니다. 프로필 순서는 콩에 중요하지 않습니다. 선언 순서는 거기서 더 중요하지만 프로필 기반 구성 파일을 사용하는 경우 순서가 중요하다는 것을 명심하십시오!
언급URL : https://stackoverflow.com/questions/23617831/what-is-the-order-of-precedence-when-there-are-multiple-springs-environment-pro
'sourcecode' 카테고리의 다른 글
공유 EntityManager에서 트랜잭션을 생성할 수 없음 - Spring 트랜잭션 또는 EJB CMT 사용 (0) | 2023.08.21 |
---|---|
다른 Oracle 데이터베이스에서 테이블 쿼리 (0) | 2023.08.21 |
부트스트랩 회전목마 : 자동 슬라이드 제거 (0) | 2023.08.21 |
Android;새 파일을 만들지 않고 파일이 있는지 확인 (0) | 2023.08.21 |
앱스토어 밖에서 iOS 애플리케이션을 배포할 수 있는 방법이 있습니까? (0) | 2023.08.21 |