>  기사  >  Java  >  SpringBoot application.yml과 bootstrap.yml의 차이점은 무엇입니까

SpringBoot application.yml과 bootstrap.yml의 차이점은 무엇입니까

王林
王林앞으로
2023-05-12 17:58:16843검색

SpringBoot는 기본적으로 속성과 YAML이라는 두 가지 형식의 구성 파일을 지원합니다. 전자는 간단한 형식이지만 키-값 쌍만 지원합니다. 목록을 표현해야 한다면 YAML 형식을 사용하는 것이 가장 좋습니다. SpringBoot는 application.yml과 같이 합의된 이름으로 구성 파일을 자동으로 로드하는 기능을 지원합니다. 사용자 정의 이름을 가진 구성 파일인 경우 다른 방법을 찾아야 합니다. 불행하게도 @PropertySource와 같은 편리한 로딩 방법을 가진 전자와 달리 후자의 로딩은 코딩 로직의 도움으로 이루어져야 합니다.

1. bootstrap.yml(bootstrap.properties) 및 application.yml(application.properties)의 실행 순서

bootstrap.yml(bootstrap.properties)은 프로그램 부팅 시 실행되며, 이전 구성 정보에 사용됩니다. 예를 들어, application.yml에 사용되는 매개변수를 구성하는 데 사용할 수 있습니다.

application.yml(application.properties)에서 사용해야 하는 공용 매개변수를 구성하는 데 사용할 수 있는 애플리케이션별 구성 정보입니다. 각 후속 모듈.

bootstrap.yml은 application.yml보다 먼저 로드됩니다.

2. 일반적인 적용 시나리오는 다음과 같습니다.

  • Spring Cloud Config Server를 사용할 때 bootstrap.yml 클라우드에 spring.application.name 및 spring을 지정해야 합니다. config.server.git.uri

  • 및 일부 암호화/복호화된 정보

기술적으로 bootstrap.yml은 상위 Spring ApplicationContext에 의해 로드됩니다. application.yml의 ApplicationContext가 로드되기 전에 부모의 Spring ApplicationContext가 먼저 로드됩니다.

왜 bootstrap.yml에 구성 서버 정보를 넣어야 하나요?

Spring Cloud를 사용할 때 구성 정보는 일반적으로 구성 서버에서 로드됩니다. 구성 정보(예: 비밀번호 등)를 얻으려면 일부 초기 부팅 구성이 필요합니다. 따라서 이 기간 동안 실제로 필요한 구성 정보를 로드하려면 bootstrap.yml에 구성 서버 정보를 넣어야 합니다.

3. 고급 사용 시나리오

Start context

Spring Cloud는 Spring 애플리케이션 애플리케이션 컨텍스트의 상위 컨텍스트로 Bootstrap Context를 생성합니다. 초기화 중에 Bootstrap 컨텍스트는 외부 소스에서 구성 속성을 로드하고 구성을 구문 분석하는 일을 담당합니다. 두 컨텍스트는 외부에서 얻은 환경을 공유합니다. 부트스트랩 속성은 우선순위가 높으며 기본적으로 로컬 구성으로 재정의되지 않습니다. 부트스트랩 컨텍스트와 애플리케이션 컨텍스트는 서로 다른 규칙을 가지므로 application.yml(또는 application.properties) 대신 새 bootstrap.yml 파일이 추가됩니다. 부트스트랩 컨텍스트와 애플리케이션 컨텍스트 구성이 분리되어 있는지 확인하세요. 예는 다음과 같습니다.

bootstrap.yml

spring:
  application:
    name: foo
  cloud:
    config:
      uri: ${SPRING_CONFIG_URI:http://localhost:8888}

bootstrap.yml 또는 application.yml에서 spring.application.name을 구성하는 것이 좋습니다. spring.cloud.bootstrap.enabled=false를 설정하여 부트스트랩을 비활성화할 수 있습니다.

애플리케이션 컨텍스트 계층

SpringApplication 또는 SpringApplicationBuilder를 통해 애플리케이션 컨텍스트를 생성하면 스프링 애플리케이션의 애플리케이션 컨텍스트에 대한 상위 컨텍스트 부트스트랩 컨텍스트가 생성됩니다. Spring에는 하위 컨텍스트가 상위 클래스의 속성 소스와 프로필을 상속하는 기능이 있으므로 기본 애플리케이션 컨텍스트는 Spring Cloud Config를 사용하지 않는 것과 비교하여 추가 속성 소스를 추가합니다. 추가 속성 소스는 다음과 같습니다.

  • "bootstrap": Bootstrap 컨텍스트에서 PropertySourceLocator를 검색하고 속성이 있는 경우 CompositePropertySource에 추가됩니다. Spirng Cloud Config는 이러한 방식으로 속성을 추가합니다. 자세한 내용은 소스 코드 ConfigServicePropertySourceLocator를 참조하세요. 아래에는 사용자 정의의 예도 있습니다.

  • "applicationConfig: [classpath:bootstrap.yml]" , (spring.profiles.active=production이 있는 경우 예를 들어 applicationConfig: [classpath:/bootstrap.yml]#production): bootstrap.yml을 사용하는 경우 부트스트랩 컨텍스트를 구성하려면 application.yml보다 우선순위가 낮습니다. Spring Boot 애플리케이션의 일부로 하위 컨텍스트에 추가됩니다. 아래에 소개합니다.

우선순위 규칙으로 인해 Bootstrap Context에는 bootstrap.yml의 데이터가 포함되지 않지만 기본 설정으로 사용할 수 있습니다.

제공하는 인터페이스를 사용하거나 SpringApplicationBuilder에 포함된 메서드(parent(), child(), sibling())를 사용하여 생성한 모든 컨텍스트 계층 구조를 쉽게 확장할 수 있습니다. 부트스트랩 컨텍스트는 가장 높은 수준의 상위 클래스가 됩니다. 각 확장 컨텍스트에는 자체 부트스트랩 속성 소스(비어 있을 수 있음)가 있습니다. 각 확장된 컨텍스트에는 서로 다른 spring.application.name이 있습니다. 원칙적으로 동일한 수준의 상위-하위 컨텍스트도 이름이 다르므로 구성 서버 구성도 달라집니다. 하위 컨텍스트의 속성은 이름이 같은 경우 상위 컨텍스트의 속성을 재정의합니다.

SpringApplicationBuilder는 모든 수준에서 환경 공유를 허용하지만 기본적으로는 그렇지 않습니다. 따라서 동일한 수준의 형제 컨텍스트는 상위 클래스와 무언가를 공유하지 않는 경우 반드시 동일한 프로필이나 속성 소스를 가질 필요는 없습니다.

부트스트랩 속성 구성 수정

소스 코드 위치 BootstrapApplicationListener.

   String configName = environment.resolvePlaceholders("${spring.cloud.bootstrap.name:bootstrap}");

    String configLocation = environment.resolvePlaceholders("${spring.cloud.bootstrap.location:}");

    Map<String, Object> bootstrapMap = new HashMap<>();bootstrapMap.put("spring.config.name",configName);
    if(StringUtils.hasText(configLocation)){
        bootstrapMap.put("spring.config.location", configLocation);
    }

bootstrap.yml是由spring.cloud.bootstrap.name(默认:”bootstrap”)或者spring.cloud.bootstrap.location(默认空)。这些属性行为与spring.config.*类似,通过它的Environment来配置引导ApplicationContext。如果有一个激活的profile(来源于spring.profiles.active或者Environment的Api构建),例如bootstrap-development.properties 就是配置了profile为development的配置文件.

覆盖远程属性

property sources被bootstrap context 添加到应用通常通过远程的方式,比如”Config Server”。默认情况下,本地的配置文件不能覆盖远程配置,但是可以通过启动命令行参数来覆盖远程配置。如果需要本地文件覆盖远程文件,需要在远程配置文件里设置授权
spring.cloud.config.allowOverride=true(这个配置不能在本地被设置)。一旦设置了这个权限,你可以配置更加细粒度的配置来配置覆盖的方式,

比如:

  • spring.cloud.config.overrideNone=true 覆盖任何本地属性

  • spring.cloud.config.overrideSystemProperties=false 仅仅系统属性和环境变量
    源文件见PropertySourceBootstrapProperties

自定义启动配置

bootstrap context是依赖/META-INF/spring.factories文件里面的org.springframework.cloud.bootstrap.BootstrapConfiguration条目下面,通过逗号分隔的Spring @Configuration类来建立的配置。任何main application context需要的自动注入的Bean可以在这里通过这种方式来获取。这也是ApplicationContextInitializer建立@Bean的方式。可以通过@Order来更改初始化序列,默认是”last”。

# spring-cloud-context-1.1.1.RELEASE.jar
# spring.factories
# AutoConfiguration
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration,\
org.springframework.cloud.autoconfigure.RefreshAutoConfiguration,\
org.springframework.cloud.autoconfigure.RefreshEndpointAutoConfiguration,\
org.springframework.cloud.autoconfigure.LifecycleMvcEndpointAutoConfiguration

# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.cloud.bootstrap.BootstrapApplicationListener,\
org.springframework.cloud.context.restart.RestartListener

# Bootstrap components
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
org.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration,\
org.springframework.cloud.bootstrap.encrypt.EncryptionBootstrapConfiguration,\
org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration,\
org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration

警告

小心,你添加的自定义BootstrapConfiguration类没有错误的@ComponentScanned到你的主应用上下文,他们可能是不需要的。使用一个另外的包不被@ComponentScan或者@SpringBootApplication注解覆盖到。

bootstrap context通过spring.factories配置的类初始化的所有的Bean都会在SpingApplicatin启动前加入到它的上下文里去。

自定义引导配置来源:Bootstrap Property Sources
默认的property source添加额外的配置是通过配置服务(Config Server),你也可以自定义添加property source通过实现PropertySourceLocator接口来添加。你可以使用它加配置属性从不同的服务、数据库、或者其他。

下面是一个自定义的例子:

@Configuration
public class CustomPropertySourceLocator implements PropertySourceLocator {

    @Override
    public PropertySource<?> locate(Environment environment) {
        return new MapPropertySource("customProperty",
                Collections.<String, Object>singletonMap("property.from.sample.custom.source", "worked as intended"));
    }
}

Environment被ApplicationContext建立,并传入property sources(可能不同个profile有不同的属性),所以,你可以从Environment寻找找一些特别的属性。比如spring.application.name,它是默认的Config Server property source。

如果你建立了一个jar包,里面添加了一个META-INF/spring.factories文件:

org.springframework.cloud.bootstrap.BootstrapConfiguration=sample.custom.CustomPropertySourceLocator

那么,”customProperty“的PropertySource将会被包含到应用。

위 내용은 SpringBoot application.yml과 bootstrap.yml의 차이점은 무엇입니까의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제