Spring Boot 사용자 정의 설정 속성 원본(PropertySource)

프로필 보다 덮어 쓰기 설정
생산 실천 에서 배치 커버 는 서로 다른 환경의 서로 다른 배 치 를 해결 하 는 데 자주 사용 되 는 방법 이다.예 를 들 어 생산 서버 의 프로필 로 가방 안의 파일 을 덮어 쓰 거나 중심 화 된 프로필 서 비 스 를 사용 하여 기본 업무 설정 을 덮어 씁 니 다.
profile 메커니즘(예 를 들 어 Maven 의 profile,spring boot 의 profile-specific properties),즉 서로 다른 환경 에서 서로 다른 프로필 을 사용 하여 덮어 쓰 는 방식 이 유리 합 니 다.프로그래머 는 개발 할 때 생산 환경 데이터 뱅 크 의 주소,계 정 등 정보 에 관심 을 가 질 필요 가 없다.한 번 에 구축 하면 서로 다른 환경 에서 실 행 될 수 있 고 profflee 체 제 는 생산 환경의 설정 을 프로젝트 자원 파일 에 기록 해 야 하 며 서로 다른 환경 에 서로 다른 구축 매개 변수 나 운영 파 라 메 터 를 사용 해 야 한다.
Spring 은 유연 한 설정 확장 능력 을 제공 합 니 다.사용자 정의 속성 원 을 여러 가지 방식 으로 통합 하여 설정 커버 를 쉽게 실현 할 수 있 습 니 다.
본 고 는 Spring Boot 1.4.8/Spring 4.3.12 를 바탕 으로 작성 되 었 다.
사용자 정의 설정 파일 과 설정 덮어 쓰기@PropertySource주 해 를 사용 합 니 다.

@ConfigurationProperties
@Configuration
public class DemoProperties {
  // properties with getter/setters
}

@PropertySource(value = {
    "test.properties",
    "file:/etc/test.properties",
},
    ignoreResourceNotFound = true)
@Configuration
public class DemoAutoConfiguration {

  @Autowired
  private DemoProperties demoProperties;

  @PostConstruct
  public void init() {
    System.out.println(demoProperties);
  }
}

Spring 은 PropertySource 주 해 를 사용 하여 사용자 정의 프로필 을 도입 하 는 것 을 지원 합 니 다.그 중에서"test.properties"는 Spring 을 classpath 에서 이 파일 을 불 러 옵 니 다."file:/etc/test.properties"는 Spring 을 파일 시스템 에서/etc/test.properties 파일 을 불 러 옵 니 다.ignoreResourceNotFound=true 는 Spring 이 파일 불 러 오 는 데 실패 한 이상 을 무시 합 니 다.즉,설정 파일 을 선택 할 수 있 습 니 다.
또한"file:/etc/test.properties"가"test.properties"에 있 기 때문에 파일 시스템 의 프로필 은 classpath 의 설정 을 덮어 쓸 수 있 습 니 다.
사용자 정의 속성 소스 공장
더 유연 한 사용자 정의 속성 원,예 를 들 어 중심 화 된 설정 서비스 에서 설정 을 불 러 오 려 면 Property SourceFactory 인 터 페 이 스 를 실현 하고 Property Source 주 해 를 설정 하 는 factory 인 자 를 통 해 이 루어 질 수 있 습 니 다.

@Configuration
@PropertySource(value = ""/*placeholder*/,
    factory = CompositePropertySourceFactory.class)
public class CompositeConfigAutoConfiguration {
}
value 필드 는 설정 원 에 대응 하 는 자원 파일 을 지정 하 는 데 사 용 됩 니 다.자원 파일 을 사용 하지 않 으 면 임의의 값 으로 설정 할 수 있 습 니 다.매개 변수 값 은 factory 매개 변수의 createPropertySource 방법 으로 전 달 됩 니 다.
ignoreResourceNotFound 필드 가 true 로 지정 되면 factory 에서 던 진 이상 은 무시 되 고 그렇지 않 으 면 시작 에 실패 합 니 다.어떤 때 는 시동 실 패 를 직접 드 러 내 는 것 이 좋 은 방법 이다.
Property SourceFactory 인터페이스의 정 의 는 다음 과 같 습 니 다.

/**
 * Strategy interface for creating resource-based {@link PropertySource} wrappers.
 *
 * @author Juergen Hoeller
 * @since 4.3
 * @see DefaultPropertySourceFactory
 */
public interface PropertySourceFactory {

 /**
 * Create a {@link PropertySource} that wraps the given resource.
 * @param name the name of the property source
 * @param resource the resource (potentially encoded) to wrap
 * @return the new {@link PropertySource} (never {@code null})
 * @throws IOException if resource resolution failed
 */
 PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException;

}

주의해 야 할 것 은 Property SourceFactory 의 로드 시기 가 Spring Beans 용기 보다 빠 르 기 때문에 실현 상 Spring 의 IOC 에 의존 해 서 는 안 된다 는 점 이다.
Property SourceFactory 는 클래스 를 Property Source 로 되 돌려 달라 고 요구 합 니 다.PropertySource 는 Spring 속성(또는 설정)기능 의 핵심 인터페이스 로 많은 실현 이 있 습 니 다.예 를 들 어:
  • Resource Property Source 가 Resource 에서 Property Source 를 불 러 옵 니 다
  • Properties PropertySource properties 파일 에서 PropertySource 를 불 러 옵 니 다
  • System Environment PropertySource 는 시스템 환경 변수 에서 PropertySource
  • 를 불 러 옵 니 다.
  • MapProperty Source 는 Property Source(Adapter 모듈)
  • 로 지 도 를 포장 했다.
  • Composite PropertySource 는 몇몇 PropertySource 를 조합 하 는 것 을 지원 합 니 다(Composite 모드)
  • 실제 실현 류 는 이보다 훨씬 못 하 다.구체 적 으로 Spring 문서 나 소스 코드 를 읽 을 수 있다.
    속성 원 을 사용자 정의 할 때 자주 사용 하 는 것 은 MapProperty Source 와 Composite Property Source 입 니 다.
    MapPropertySource 는 자신 이 불 러 온 속성 데이터 포장 에 사용 할 수 있 으 며 구조 방법 을 참고 할 수 있 습 니 다.
    
    public MapPropertySource(String name, Map<String, Object> source) {
     super(name, source);
    }
    
    후 자 는 여러 속성 원 을 조합 해서 불 러 오고 덮어 쓰기 순 서 를 사용자 정의 할 수 있 습 니 다.예 를 들 면:
    
    PropertySource<?> packageInsidePropertySource = packageInsidePropertySourceIterateLoader.loadPropertySource(compositePropertySource);
    compositePropertySource.addPropertySource(packageInsidePropertySource);
    
    PropertySource<?> outerFilePropertySource = outerFilePropertySourceIterateLoader.loadPropertySource(compositePropertySource);
    //        
    compositePropertySource.addFirstPropertySource(outerFilePropertySource);
    
    addFirst Property Source 방법 은 들 어 오 는 Property Source 를 최고 우선 순위(이 Composite Property Source 내부)로 설정 할 수 있 으 며,addProperty Source 방법 은 반대로 뒤에 놓 인 우선 순위 가 더 낮 습 니 다.
    jar 패키지 에 의존 하 는 모든 동명 의 프로필 불 러 오기
    classpath 에서 프로필 을 직접 불 러 옵 니 다.classpath 에 파일 이 존재 해 야 합 니 다.WEB 프로젝트 에서 파일 이 의존 하 는 jar 패키지 에 존재 한다 면 WEB-INF/lib/xxx.jar 에 있 습 니 다.이 때 classpath 기반 으로 직접 불 러 올 수 없습니다.이 때 Spring 에서 제공 하 는PathMatchingResourcePatternResolver을 사용 하여 자원 이름 에 따라 모든 jar 패 키 지 를 스 캔 하여 목적 을 실현 할 수 있 습 니 다.
    
    private List<Resource> getPackageInsideResourcesByPattern(String resourceName) throws IOException {
     String resourcePathPattern = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + HbootConfigConstants.CONFIGS + resourceName;
     ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
     return Arrays.asList(resourcePatternResolver.getResources(resourcePathPattern));
    }
    그리고 리 소스 Property Source 를 사용 하여 리 소스 에서 Property Source 를 구축 하여 Spring 에 전달 할 수 있 습 니 다.
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기