Bootstrap.yml的作用

简介: Bootstrap.yml的作用

Bootstrap.yml的作用

加载顺序

若application.yml 和bootstrap.yml 在同一目录下:bootstrap.yml 先加载 application.yml后加载

bootstrap.yml 用于应用程序上下文的引导阶段。bootstrap.yml 由父Spring ApplicationContext加载。

配置区别

bootstrap是spring cloud的配置上下文加载。由spring-cloud-content包加载。

引入依赖

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter</artifactId>
</dependency>

application是spring boot的配置加载。

引入依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

Snipaste_2021-06-24_14-32-02.png

具体加载类

image-20210624143603126.png

部分代码

@Override
public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {
 ConfigurableEnvironment environment = event.getEnvironment();
  //# spring.cloud.bootstrap.enabled 引导开关
 if (!environment.getProperty("spring.cloud.bootstrap.enabled", Boolean.class,
   true)) {
  return;
 }
 // don't listen to events in a bootstrap context
 if (environment.getPropertySources().contains(BOOTSTRAP_PROPERTY_SOURCE_NAME)) {
  return;
 }
 ConfigurableApplicationContext context = null;
  // 引导文件名称 默认bootstrap
 String configName = environment
   .resolvePlaceholders("${spring.cloud.bootstrap.name:bootstrap}");
  // 加载配置
 for (ApplicationContextInitializer<?> initializer : event.getSpringApplication()
   .getInitializers()) {
   // 从ParentContent加载
  if (initializer instanceof ParentContextApplicationContextInitializer) {
   context = findBootstrapContext(
     (ParentContextApplicationContextInitializer) initializer,
     configName);
  }
 }
 if (context == null) {
  context = bootstrapServiceContext(environment, event.getSpringApplication(),
    configName);
  event.getSpringApplication()
    .addListeners(new CloseContextOnFailureApplicationListener(context));
 }

 apply(context, event.getSpringApplication(), environment);
}

bootstrap.yml 和 application.yml 都可以用来配置参数。

bootstrap.yml 用来程序引导时执行,应用于更加早期配置信息读取。可以理解成系统级别的一些参数配置,这些参数一般是不会变动的。一旦bootStrap.yml 被加载,则内容不会被覆盖。

application.yml 可以用来定义应用级别的, 应用程序特有配置信息,可以用来配置后续各个模块中需使用的公共参数等。

属性覆盖问题

启动上下文时,Spring Cloud 会创建一个 Bootstrap Context,作为 Spring 应用的 Application Context 的父上下文。

初始化的时候,Bootstrap Context 负责从外部源加载配置属性并解析配置。这两个上下文共享一个从外部获取的 Environment。Bootstrap 属性有高优先级,默认情况下,它们不会被本地配置覆盖。

也就是说如果加载的 application.yml 的内容标签与 bootstrap 的标签一致,application 也不会覆盖 bootstrap,而 application.yml 里面的内容可以动态替换。

bootstrap.yml典型的应用场景

微服务的 注册中心、配置中心、项目名称spring.application.name

以nacos为例

spring:
  application:
    name: paw-alibaba-nacos
  # profile
  profiles:
    active: dev

  # nacos
  cloud:
    nacos:
      discovery:
        server-addr: http://localhost:8848
        username: nacos
        password: 123456

      config:
        server-addr: http://localhost:8848
        username: nacos
        password: 123456
        context-path: nacos
        file-extension: yaml
        prefix: ${spring.application.name}

springcloud 2020.0 默认不优先加载bootstrap.yml

nacos报错Param ‘serviceName‘ is illegal, serviceName is blank,但是我在bootstrap.yml文件中配置了服务名

解决:

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-bootstrap</artifactId>
   <version>3.0.4</version>
</dependency>
相关文章
|
2月前
|
安全 Java 数据库连接
《Spring Boot配置文件大揭秘:看懂 application.yaml 与 bootstrap.yaml 的不同》
《Spring Boot配置文件大揭秘:看懂 application.yaml 与 bootstrap.yaml 的不同》
64 0
|
9月前
|
容器
sprintboot读取自定义配置文件properties、yml、yaml,环境springboot2.4.4
我这里使用的是springboot2.4.4的版本,其他版本自测
|
10月前
|
Java
Springboot中配置文件application.yaml的位置
Springboot中配置文件application.yaml的位置
|
11月前
|
前端开发 Java API
SpringBoot 常用的配置文件 application.yml和 bootstrap.yml的区别
SpringBoot默认支持properties和YAML两种格式的配置文件。前者格式简单,但是只支持键值对。如果需要表达列表,最好使用YAML格式。SpringBoot支持自动加载约定名称的配置文件,例如application.yml。如果是自定义名称的配置文件,就要另找方法了。可惜的是,不像前者有@PropertySource这样方便的加载方式,后者的加载必须借助编码逻辑来实现。
338 0
|
Java 应用服务中间件 Spring
SpringBoot Application事件监听的实现方案(动态写入yml)
SpringBoot Application事件监听的实现方案(动态写入yml)
SpringBoot Application事件监听的实现方案(动态写入yml)
|
前端开发
bootstrap 内容总结
bootstrap 内容总结
springboot 使用yml配置文件自定义属性
springboot 中在application.yml文件里自定义属性值,配合@Value注解可以在代码中直接取到相应的值,如在application.yml中添加
|
NoSQL 测试技术 Redis
一日一技:优雅地加载Yaml配置文件
一日一技:优雅地加载Yaml配置文件
753 0
一日一技:优雅地加载Yaml配置文件
|
Java Spring 容器
Springboot 指定获取出 yml文件里面的配置值
Springboot 指定获取出 yml文件里面的配置值
219 0
Springboot 指定获取出 yml文件里面的配置值