[SPRING] 공유 라이브러리에서 스프링 클라우드 부트 스트랩 속성을 관리하는 방법은 무엇입니까?
SPRING공유 라이브러리에서 스프링 클라우드 부트 스트랩 속성을 관리하는 방법은 무엇입니까?
Spring Cloud Config / Eureka 설정을 사용하는 응용 프로그램에 대해 독창적 인 구성을 제공하는 라이브러리를 작성하는 중입니다. 아이디어는 개별 microservice 앱에 스프링 클라우드 관련 보일러 플레이트가 거의 없거나 전혀없는 사용자 정의 스타터로이 구성을 제공하는 것입니다.
이 시점에서이 라이브러리에 넣으려는 공유 구성의 대부분은 bootstrap.yml의 내용으로 구성됩니다. 내 맞춤 스타터에 bootstrap.yml을 제공하고 싶지만 라이브러리를 사용하는 응용 프로그램은 spring.application.name을 적절하게 설정할 수있을지라도 여전히 자신의 bootstrap.yml을 제공 할 수 있어야합니다.
classpath에서 bootstrap.yml이로드되는 방식 때문에, 응용 프로그램에 고유 한 bootstrap.yml이 있으면 Spring은 공유 라이브러리의 내용을 무시한 것 같습니다. 부트 스트랩 컨텍스트가 ApplicationContextInitializers를 다루는 특별한 방법으로 인해 ApplicationContextInitializer를 사용하여 환경을 사용자 정의 할 수도 없습니다.
누구든지 여기서 일할 접근법에 대한 권고 사항이 있습니까? 우리의 모든 프로젝트에서 상용구 bootstrap.yml을 복제 할 필요없이 우리의 독창적 인 부트 스트랩 설정을 작동시키는 드롭 인 (drop-in) lib를 제공하고 싶습니다.
해결법
-
==============================
1.META-INF / spring.factories 파일의 org.springframework.cloud.bootstrap.BootstrapConfiguration 키를 사용하여 공유 라이브러리의 PropertySource를 부트 스트랩 특성에 추가 할 수 있습니다.
META-INF / spring.factories 파일의 org.springframework.cloud.bootstrap.BootstrapConfiguration 키를 사용하여 공유 라이브러리의 PropertySource를 부트 스트랩 특성에 추가 할 수 있습니다.
예를 들어, 다음을 포함하는 라이브러리를 작성할 수 있습니다.
src / main / java / com / example / mylib / MyLibConfig.java
package com.example.mylib; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; @Configuration @PropertySource("classpath:mylib-config.properties") public class MyLibConfig { }
src / main / resources / mylib-config.properties
eureka.instance.public=true # or whatever...
src / main / resources / META-INF / spring.factories
org.springframework.cloud.bootstrap.BootstrapConfiguration=com.example.mylib.MyLibConfig
세부 정보 : http://projects.spring.io/spring-cloud/spring-cloud.html#_customizing_the_bootstrap_configuration
-
==============================
2.나는 이것에 대한 해결책을 찾을 수 있었다. 이 솔루션의 목표는 다음과 같습니다.
나는 이것에 대한 해결책을 찾을 수 있었다. 이 솔루션의 목표는 다음과 같습니다.
주요 과제는 애플리케이션 라이프 사이클의 적절한 시점에 코드를 삽입하는 것입니다. 특히, 우리는 bootstrap.yml PropertySource가 환경에 추가 된 후에 그것을 수행해야합니다 (사용자 정의 PropertySource를 적절한 순서로 주입 할 수 있도록). 또한 응용 프로그램이 Bean 구성을 시작하기 전에 (구성 값 제어 행동).
내가 찾은 해결책은 사용자 지정 EnvironmentPostProcessor를 사용하는 것이 었습니다.
public class CloudyConfigEnvironmentPostProcessor implements EnvironmentPostProcessor, Ordered { private YamlPropertySourceLoader loader; public CloudyConfigEnvironmentPostProcessor() { loader = new YamlPropertySourceLoader(); } @Override public void postProcessEnvironment(ConfigurableEnvironment env, SpringApplication application) { //ensure that the bootstrap file is only loaded in the bootstrap context if (env.getPropertySources().contains("bootstrap")) { //Each document in the multi-document yaml must be loaded separately. //Start by loading the no-profile configs... loadProfile("cloudy-bootstrap", env, null); //Then loop through the active profiles and load them. for (String profile: env.getActiveProfiles()) { loadProfile("cloudy-bootstrap", env, profile); } } } private void loadProfile(String prefix, ConfigurableEnvironment env, String profile) { try { PropertySource<?> propertySource = loader.load(prefix + (profile != null ? "-" + profile: ""), new ClassPathResource(prefix + ".yml"), profile); //propertySource will be null if the profile isn't represented in the yml, so skip it if this is the case. if (propertySource != null) { //add PropertySource after the "applicationConfigurationProperties" source to allow the default yml to override these. env.getPropertySources().addAfter("applicationConfigurationProperties", propertySource); } } catch (IOException e) { throw new RuntimeException(e); } } @Override public int getOrder() { //must go after ConfigFileApplicationListener return Ordered.HIGHEST_PRECEDENCE + 11; } }
이 커스텀 EnvironmentPostProcessor는 META-INF / spring.factories를 통해 주입 될 수 있습니다 :
#Environment PostProcessors org.springframework.boot.env.EnvironmentPostProcessor=\ com.mycompany.cloudy.bootstrap.autoconfig.CloudyConfigEnvironmentPostProcessor
주목해야 할 몇 가지 사항 :
편집 : 내 초기 대답이 작동하지 않았다. 나는 그것을이 것으로 대체 할 것이다.
from https://stackoverflow.com/questions/37888231/how-to-manage-spring-cloud-bootstrap-properties-in-a-shared-library by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 원인 : java.lang.ClassNotFoundException : org.elasticsearch.transport.Netty3Plugin (0) | 2019.05.10 |
---|---|
[SPRING] JQuery 파일 업로드는 각 게시물 요청의 각 파일을 보냅니 까? (0) | 2019.05.09 |
[SPRING] 다른 JAR에서 정의 된 경우 Spring Aspect가 실행되지 않는다. (0) | 2019.05.09 |
[SPRING] 봄철 mongodb에 JSON 스키마 저장하기 (0) | 2019.05.09 |
[SPRING] 같은 클래스에 대한 컴포넌트 스캐닝과 XML 빈 정의를 혼합 할 때의 스프링 동작? (0) | 2019.05.09 |