[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.나는 그것이 아직 받아 들여지지 않았기 때문에 제출하고 대답하기로 결정했다. 그것은 당신이 특별히 찾고있는 것이 아니지만 그것은 나를 위해 일합니다. 또한 새로운 주석 구동 구성을 사용하고 있지만 XML 구성으로 이식 할 수 있습니다.
나는 그것이 아직 받아 들여지지 않았기 때문에 제출하고 대답하기로 결정했다. 그것은 당신이 특별히 찾고있는 것이 아니지만 그것은 나를 위해 일합니다. 또한 새로운 주석 구동 구성을 사용하고 있지만 XML 구성으로 이식 할 수 있습니다.
각 환경 (dev.properties, test.properties 등)에 대한 특성 파일이 있습니다.
그런 다음 모든 구성에 사용되는 클래스 인 RootConfig 클래스가 있습니다. 이 클래스에있는 모든 것은 @Configuration과 @ComponentScan (basePackageClasses = RootConfig.class)의 두 가지 주석입니다. 이것은 같은 패키지에있는 내용을 스캔하도록 지시합니다.
그때 내 모든 정상적인 구성을 포함하는 구성이 어디에 앉아있다. 또한 위의 루트 구성 클래스와 동일한 패키지의 각 환경에 대한 구성이 있습니다.
환경 고유의 설정은, 환경 고유의 프로퍼티 파일을 가리키는 다음의 주석을 가지는 단순한 마커 클래스입니다.
@Configuration @PropertySource("classpath:dev.properties") @Import(NormalConfig.class) @Profile("dev")
가져 오기에서는 일반 구성 클래스를 가져 오도록 지정합니다. 하지만 거기에 도착하면 환경 별 속성이 설정됩니다.
-
==============================
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 제공 - 프로파일 : 프로파일에 따라로드 된 다른 특성. - 공통 : 모든 프로필이 동일한 값을 공유 할 때 기본값으로 값을 포함합니다.
from https://stackoverflow.com/questions/10669474/load-properties-file-in-spring-depending-on-profile by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 데이터베이스 나 속성으로부터 Spring 보안 인터셉트 URL 가져 오기 (0) | 2019.02.16 |
---|---|
[SPRING] 스프링 mvc 중첩 모델 유효성 검사 (0) | 2019.02.16 |
[SPRING] 봄 부팅 - SMTP 호스트에 연결할 수 없습니다 : smtp.gmail.com, 포트 : 25, 응답 : 421 (0) | 2019.02.16 |
[SPRING] Spring에서 RequestRejectedException을 인터셉트하는 방법은 무엇입니까? (0) | 2019.02.15 |
[SPRING] 데이터 소스 자동 구성에 실패했습니다 : 'spring.datasource.url'이 지정되지 않았습니다. (0) | 2019.02.15 |