sourcecode

spring.profiles.active에 의해 설정된 여러 Spring의 환경 프로파일이 있는 경우 우선순위는 무엇입니까?

codebag 2023. 8. 21. 21:15
반응형

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를 명시적으로 지정할 수 없기 때문에 둘 이상을 사용할 경우 어떤 동작이 나타날지 잘 모르겠습니다.속성이 병합되어 양쪽에서 정의한 속성은 마지막 정의를 사용하지만 각 파일에 고유한 속성은 그대로 유지됩니다.

그렇지 않으면, 제 경험상, 당신은 일반적으로 콩을 다음과 같은 순서로 정의할 것입니다.

  1. 프로파일에 특정되지 않은 "기본" 빈 정의
  2. 환경별 프로필에서 빈 정의 재정의
  3. 테스트별 프로필에서 빈 정의 재정의

이렇게 하면 다른 프로파일과 함께 사용할 경우 테스트 프로파일 콩이 승리합니다. 그렇지 않으면 환경별 콩을 사용하거나 프로파일에 기반한 기본 콩을 사용합니다.

마지막 정의가 승리합니다.염두에 두고 있지만,

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

최종 순서는 다음과 같습니다(마지막 우승).

  1. 자원 application.properties
  2. application.properties
  3. 자원 application-p1.properties
  4. application-p1.properties
  5. application-p2.properties
  6. 관리 application-p3.properties여기서 비결이 있습니다! 이것은 p1p2의 외부 파일에 정의된 속성을 p3의 리소스 버전 값으로 덮어씁니다.
  7. 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

반응형