복붙노트

[SPRING] 프로필에 따라 Spring에서 속성 파일로드

SPRING

프로필에 따라 Spring에서 속성 파일로드

Spring 3.1 애플리케이션이있다. XML에 다음 내용이 포함되어 있다고 가정 해 보겠습니다.

<context:property-placeholder location="classpath:somename.properties" />

<context:property-placeholder location="classpath:xxx.properties" />

나는 some.properties가 항상로드되기를 원한다. (존재한다고 가정하자.)하지만 두 번째 place holder의 xxx 부분은 활성 프로파일에 따라 약간의 이름으로 대체된다. 나는 이것을 시도했다.

<beans profile="xx1">
    <context:property-placeholder location="classpath:xx1.properties" />
</beans>

<beans profile="xx2">
    <context:property-placeholder location="classpath:xx2.properties" />
</beans>

또한 두 파일은 같은 키이지만 값이 다른 속성을 가지고 있습니다.

그러나 xx1.properties (및 xx2.properties)에 정의 된 키를 가진 하나의 속성에 대한 자리 표시자를 가진 이후의 빈처럼 작동하지 않아 Spring이 응용 프로그램 컨텍스트에서 키를 찾을 수 없다는 불평을하게합니다.

해결법

  1. ==============================

    1.나는 그것이 아직 받아 들여지지 않았기 때문에 제출하고 대답하기로 결정했다. 그것은 당신이 특별히 찾고있는 것이 아니지만 그것은 나를 위해 일합니다. 또한 새로운 주석 구동 구성을 사용하고 있지만 XML 구성으로 이식 할 수 있습니다.

    나는 그것이 아직 받아 들여지지 않았기 때문에 제출하고 대답하기로 결정했다. 그것은 당신이 특별히 찾고있는 것이 아니지만 그것은 나를 위해 일합니다. 또한 새로운 주석 구동 구성을 사용하고 있지만 XML 구성으로 이식 할 수 있습니다.

    각 환경 (dev.properties, test.properties 등)에 대한 특성 파일이 있습니다.

    그런 다음 모든 구성에 사용되는 클래스 인 RootConfig 클래스가 있습니다. 이 클래스에있는 모든 것은 @Configuration과 @ComponentScan (basePackageClasses = RootConfig.class)의 두 가지 주석입니다. 이것은 같은 패키지에있는 내용을 스캔하도록 지시합니다.

    그때 내 모든 정상적인 구성을 포함하는 구성이 어디에 앉아있다. 또한 위의 루트 구성 클래스와 동일한 패키지의 각 환경에 대한 구성이 있습니다.

    환경 고유의 설정은, 환경 고유의 프로퍼티 파일을 가리키는 다음의 주석을 가지는 단순한 마커 클래스입니다.

    @Configuration
    @PropertySource("classpath:dev.properties")
    @Import(NormalConfig.class)
    @Profile("dev")
    

    가져 오기에서는 일반 구성 클래스를 가져 오도록 지정합니다. 하지만 거기에 도착하면 환경 별 속성이 설정됩니다.

  2. ==============================

    2.넌 할 수있어:

    넌 할 수있어:

      <context:property-placeholder location="classpath:${spring.profiles.active}.properties" />
    

    그것은 잘 작동하지만 같은 시간에 여러 개의 프로필을 사용하는 경우 아마도 적응되지 않습니다.

    두 개의 속성 자리 표시자를 선언 할 때 첫 번째 항목에 모든 응용 프로그램 키가 포함되어 있지 않으면 unresolvable = true를 무시하고 두 번째 자리 표시자를 사용할 수 있도록 속성을 넣어야합니다. 나는 그것이 당신이하고 싶은 것인지 확신하지 못합니다. xx1과 xx2 프로파일이 동시에 활성화되기를 원할 수도 있습니다.

    이와 같이 2 개의 속성 자리 표시자를 선언하면 xx2.properties를 선언 할 때 xx1.properties의 값을 다시 사용할 수 없습니다.

    고급 기능이 필요한 경우 응용 프로그램 시작시 PropertySources를 등록 할 수 있습니다.

    을 포함한다.

      <context-param>
        <param-name>contextInitializerClasses</param-name>
        <param-value>com.xxx.core.spring.properties.PropertySourcesApplicationContextInitializer</param-value>
      </context-param>
    

    당신이 창조하는 파일 :

    public class PropertySourcesApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
    
      private static final Logger LOGGER = LoggerFactory.getLogger(PropertySourcesApplicationContextInitializer.class);
    
      @Override
      public void initialize(ConfigurableApplicationContext applicationContext) {
        LOGGER.info("Adding some additional property sources");
        String profile = System.getProperty("spring.profiles.active");
        // ... Add property sources according to selected spring profile 
        // (note there already are some property sources registered, system properties etc)
        applicationContext.getEnvironment().getPropertySources().addLast(myPropertySource);
      }
    
    }
    

    일단 작업을 완료하면 컨텍스트에 추가하면됩니다.

    <context:property-placeholder/>
    

    Imho는 스프링 프로퍼티를 다루는 가장 좋은 방법입니다. 왜냐하면 여러분은 더 이상 로컬 프로퍼티를 선언하지 않고, 어떤 일이 일어나고 있는지 프로그램 적으로 제어 할 수 있고 xx2.properties에서 프로퍼티 소스 xx1 값을 사용할 수 있기 때문입니다.

    직장에서 우리는 그것을 사용하고 그것은 잘 작동합니다. 우리는 추가로 3 개의 부동산 소스를 등록합니다 : - 인프라 : Puppet 제공 - 프로파일 : 프로파일에 따라로드 된 다른 특성. - 공통 : 모든 프로필이 동일한 값을 공유 할 때 기본값으로 값을 포함합니다.

  3. from https://stackoverflow.com/questions/10669474/load-properties-file-in-spring-depending-on-profile by cc-by-sa and MIT license