写点什么

Bootstrap.yml 的作用

作者:Rubble
  • 2022 年 4 月 14 日
  • 本文字数:1578 字

    阅读完需:约 5 分钟

加载顺序

若 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>
复制代码



具体加载类



部分代码


@Overridepublic 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}
复制代码


用户头像

Rubble

关注

还未添加个人签名 2021.06.01 加入

还未添加个人简介

评论

发布
暂无评论
Bootstrap.yml的作用_4月日更_Rubble_InfoQ写作平台