머리말
프로젝트에서 유연하게 구성하기 위해 종종 구성 파일을 사용합니다. 일반적인 구성 파일은 XML 및 속성과 같습니다. SpringBoot을 사용하면 속성 및 YAML 파일을 외부 구성으로 사용할 수 있습니다. YAML 언어에 대한 컴파일러의 지원은 이제 충분하지 않으며 속성 파일은 여전히 외부 구성으로 사용됩니다.
Spring Cloud Config가 나오기 전에 ZK 기반 구성 센터를 구현하고 로컬 속성 구성 파일을 제거했습니다. 원리는 매우 간단하지만 PropertyPlaceHolderConfigurer의 mergeProperties() 과부하 시켰습니다.
/*** Merge 속성 구현을 과부하* 첫 번째로드 파일 속성을 과부하시키고 ZK 구성 센터에서 읽은 속성으로 병합* @return 부동산 수집* @Throws IOException Exception*/ @reverideProtected Properties MengeProperties () Throws IoException {repperties result = new Properties (); // 상위 클래스 속성의 구성을로드합니다. mergeProperties = super.MergeProperties (); result.putAll (mergeProperties); // 구성을로드 ZK MAP <string, String> configs = loadzkconfigs (); result.putAll (configs); 반환 결과;} 이 구현은 Spring Project에서 사용하기가 매우 쉽지만 최근 일부 Spring-Boot Project는이 자리 표시 자 구현과 Spring Boot의 @ConfigurationProperties(prefix = "xxx") 잘 작동 할 수 없음을 발견했습니다.
즉, 속성은 해결되지 않으며 @Value 방식으로 읽을 수 있지만 @Value에 대한 속성이 많으면 여전히 번거롭습니다. 나는 여전히 @configurationProperties의 접두사를 사용하는 경향이 있습니다. 그래서 나는 Spring Boot 문서를보고 PropertySource를 발견했습니다.
주문하다:
* 홈 디렉토리의 DevTools 글로벌 설정 속성 (~/.spring-boot-devtools.properties devtools가 활성화 될 때).
* 테스트에서 @TestPropertySource 주석.
* @SpringBoottest#속성 테스트에서 주석 속성.
* 명령 줄 인수.
* spring_application_json의 속성 (환경 변수 또는 시스템 속성에 포함 된 인라인 JSON)
* servletconfig init 매개 변수.
* ServletContext init 매개 변수.
* Java의 JNDI 속성 : comp/env.
* Java System Properties (System.GetProperties ()).
* OS 환경 변수.
* randomvaluepropertysource random random.*.
* 포장 된 JAR 외부의 프로필 별 애플리케이션 속성 (응용 프로그램-{프로파일} .Properties 및 YAML 변형)
* 프로필 별 응용 프로그램 속성 항아리 내부에 포장 된 (응용 프로그램-{프로파일} .properties and Yaml 변형)
* 포장 된 JAR 외부의 응용 프로그램 속성 (Application.Properties 및 YAML 변형).
* 항아리 내부에 포장 된 응용 프로그램 속성 (Application.Properties 및 YAML 변형).
* @Configuration 클래스에서 @PropertySource 주석.
* 기본 속성 (SpringApplication.SetDefaultProperties를 사용하여 지정 됨).
Java 시스템 속성의 속성을 확인할 수 있음을 찾는 것은 어렵지 않습니다. 즉, MergeProperties에서 읽은 속성을 Java System Props에 작성하고 소스 코드를보고 입력 지점을 찾으십시오.
/*** 과부하 처리 속성 구현* 옵션에 따라 병합 된 소품을 시스템 속성에 작성할지 여부를 결정하십시오. 스프링 부츠가 * * @param beanfactorytoprocess * @param props 병합 된 특성 * @throws beansexception */ @atremberedprotected void processProperties (configurablistablebeanfactory beanfactorytoprocess, properties props) 콩 xception {// original logic super.processproperties (beanfactory.); // 시스템 속성에 쓰기 if (writePropStosystem) {// 스프링 부팅 열거 시스템에 모든 속성을 쓰기 <?> propertynames = props.propertyNames (); while (propertynames.hasmoreElements ()) {string propertyname = (string) propertynames.nextElement (); 문자열 propertyValue = props.getProperty (PropertyName); System.SetProperty (PropertyName, PropertyValue); }}} 과도한 충격을 피하기 위해 스위치는 시스템 속성을 작성하도록 설정되어 있습니다. Spring Boot 프로젝트 인 경우 온라인 비 스프링 부츠 프로젝트에 미치는 영향을 최소화하기 위해 켜십시오. 그런 다음 Spring Boot의 @ConfigurationProperties 속성을 완벽하게 읽습니다.
특정 코드 : org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor 를 참조하십시오
@OverRidePublic Object PostProcessBeforeInitialization (Object Bean, String Beanname)은 Beansexception {configurationProperties annotation = AnnotationUtils .findAntation (bean.getClass (), configurationProperties.class); if (annotation! = null) {postprocessbeforeinitialization (bean, beanname, annotation); } annotation = this.beans.findFactoryAntation (BeanName, configurationProperties.class); if (annotation! = null) {postprocessbeforeinitialization (bean, beanname, annotation); } 반환 Bean;}요약
위는이 기사의 전체 내용입니다. 이 기사의 내용에 모든 사람의 연구 나 작업에 대한 특정 참조 가치가 있기를 바랍니다. 궁금한 점이 있으면 의사 소통을 위해 메시지를 남길 수 있습니다. Wulin.com을 지원 해주셔서 감사합니다.