Spring Boot 사용자 정의 설정 속성 원본(PropertySource)
6361 단어 SpringBoot속성 원본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 속성(또는 설정)기능 의 핵심 인터페이스 로 많은 실현 이 있 습 니 다.예 를 들 어:
속성 원 을 사용자 정의 할 때 자주 사용 하 는 것 은 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 에 전달 할 수 있 습 니 다.이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[MeU] Hashtag 기능 개발➡️ 기존 Tag 테이블에 존재하지 않는 해시태그라면 Tag , tagPostMapping 테이블에 모두 추가 ➡️ 기존에 존재하는 해시태그라면, tagPostMapping 테이블에만 추가 이후에 개발할 태그 기반 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.