返回顶部
首页 > 资讯 > 精选 >SpringBoot application.yml和bootstrap.yml的区别是什么
  • 850
分享到

SpringBoot application.yml和bootstrap.yml的区别是什么

2023-07-06 05:07:25 850人浏览 八月长安
摘要

本篇内容介绍了“SpringBoot application.yml和bootstrap.yml的区别是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家

本篇内容介绍了“SpringBoot application.yml和bootstrap.yml的区别是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

springBoot默认支持properties和YAML两种格式的配置文件。前者格式简单,但是只支持键值对。如果需要表达列表,最好使用YAML格式。SpringBoot支持自动加载约定名称的配置文件,例如application.yml。如果是自定义名称的配置文件,就要另找方法了。可惜的是,不像前者有@PropertySource这样方便的加载方式,后者的加载必须借助编码逻辑来实现。

一、bootstrap.yml(bootstrap.properties)与application.yml(application.properties)执行顺序

bootstrap.yml(bootstrap.properties)用来在程序引导时执行,应用于更加早期配置信息读取,如可以使用来配置application.yml中使用到参数等

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

bootstrap.yml 先于 application.yml 加载

二、典型的应用场景如下:

  • 当使用 spring cloud Config Server 的时候,你应该在 bootstrap.yml 里面指定 spring.application.name 和 spring.cloud.config.server.git.uri

  • 和一些加密/解密的信息

技术上,bootstrap.yml 是被一个父级的 Spring ApplicationContext 加载的。这个父级的 Spring ApplicationContext是先加载的,在加载application.yml 的 ApplicationContext之前。

为何需要把 config server 的信息放在 bootstrap.yml 里?

当使用 Spring Cloud 的时候,配置信息一般是从 config server 加载的,为了取得配置信息(比如密码等),你需要一些提早的引导配置。因此,把 config server 信息放在 bootstrap.yml,用来加载在这个时期真正需要的配置信息。

三、高级使用场景

启动上下文

Spring Cloud会创建一个Bootstrap Context,作为Spring应用的Application Context的父上下文。初始化的时候,Bootstrap Context负责从外部源加载配置属性并解析配置。这两个上下文共享一个从外部获取的Environment。Bootstrap属性有高优先级,默认情况下,它们不会被本地配置覆盖。 Bootstrap context和Application Context有着不同的约定,所以新增了一个bootstrap.yml文件,而不是使用application.yml (或者application.properties)。保证Bootstrap Context和Application Context配置的分离。下面是一个例子:

bootstrap.yml

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

推荐在bootstrap.yml or application.yml里面配置spring.application.name. 你可以通过设置spring.cloud.bootstrap.enabled=false来禁用bootstrap。

应用上下文层次结构

如果你通过SpringApplication或者SpringApplicationBuilder创建一个Application Context,那么会为spring应用的Application Context创建父上下文Bootstrap Context。在Spring里有个特性,子上下文会继承父类的property sources and profiles ,所以main application context 相对于没有使用Spring Cloud Config,会新增额外的property sources。额外的property sources有:

  • “bootstrap” : 如果在Bootstrap Context扫描到PropertySourceLocator并且有属性,则会添加到CompositePropertySource。Spirng Cloud Config就是通过这种方式来添加的属性的,详细看源码ConfigServicePropertySourceLocator`。下面也也有一个例子自定义的例子。

  • “applicationConfig: [classpath:bootstrap.yml]” ,(如果有spring.profiles.active=production则例如 applicationConfig: [classpath:/bootstrap.yml]#production): 如果你使用bootstrap.yml来配置Bootstrap Context,他比application.yml优先级要低。它将添加到子上下文,作为Spring Boot应用程序的一部分。下文有介绍。

由于优先级规则,Bootstrap Context不包含从bootstrap.yml来的数据,但是可以用它作为默认设置。

你可以很容易的扩展任何你建立的上下文层次,可以使用它提供的接口,或者使用SpringApplicationBuilder包含的方法(parent(),child(),sibling())。Bootstrap Context将是最高级别的父类。扩展的每一个Context都有有自己的bootstrap property source(有可能是空的)。扩展的每一个Context都有不同spring.application.name。同一层层次的父子上下文原则上也有一有不同的名称,因此,也会有不同的Config Server配置。子上下文的属性在相同名字的情况下将覆盖父上下文的属性。

注意SpringApplicationBuilder允许共享Environment到所有层次,但是不是默认的。因此,同级的兄弟上下文不在和父类共享一些东西的时候不一定有相同的profiles或者property sources。

修改Bootstrap属性配置

源码位置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# AutoConfigurationorg.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 Listenersorg.springframework.context.ApplicationListener=\org.springframework.cloud.bootstrap.BootstrapApplicationListener,\org.springframework.cloud.context.restart.RestartListener# Bootstrap componentsorg.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接口来添加。你可以使用它加配置属性从不同的服务、数据库、或者其他。

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

@Configurationpublic 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的区别是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: SpringBoot application.yml和bootstrap.yml的区别是什么

本文链接: https://lsjlt.com/news/357840.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • SpringBoot application.yml和bootstrap.yml的区别是什么
    本篇内容介绍了“SpringBoot application.yml和bootstrap.yml的区别是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家...
    99+
    2023-07-06
  • SpringBootapplication.yml和bootstrap.yml的区别
    目录一、bootstrap.yml(bootstrap.properties)与application.yml(application.properties)执行顺序二、典型的应用场...
    99+
    2023-05-16
    SpringBoot application.yml bootstrap.yml
  • Spring和SpringBoot的区别是什么
    今天小编给大家分享一下Spring和SpringBoot的区别是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、看一下...
    99+
    2023-06-27
  • j2ee和springboot的区别是什么
    J2EE(Java 2 Platform, Enterprise Edition)是一种大型的企业级Java开发平台,提供了一整套的...
    99+
    2024-04-02
  • springboot-starter-undertow和tomcat的区别是什么
    本篇内容主要讲解“springboot-starter-undertow和tomcat的区别是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“springboot-starter-undert...
    99+
    2023-06-29
  • springboot中@Controller和@RestController的区别是什么
    小编给大家分享一下springboot中@Controller和@RestController的区别是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!@Cont...
    99+
    2023-06-25
  • SpringBoot之bootstrap和application的区别是什么
    本篇内容主要讲解“SpringBoot之bootstrap和application的区别是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot之bootstrap和applic...
    99+
    2023-07-05
  • springboot @Repository与@Mapper的区别是什么
    本篇内容介绍了“springboot @Repository与@Mapper的区别是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所...
    99+
    2023-06-29
  • Spring和SpringBoot最核心的3大区别是什么
    这篇文章给大家介绍Spring和SpringBoot最核心的3大区别是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。概述对于 Spring和 SpringBoot到底有什么区别,我听到了很多答案,刚开始迈入学习 S...
    99+
    2023-06-16
  • php === 和==的区别是什么
    本文操作环境:windows7系统、PHP7.1版、DELL G3电脑php === 和==的区别是什么?php中的==和===的用法及区别在开发中进场遇到数值匹配的问题,那么在进行匹配时,遇到下面的情况,你觉得结果是什么?<php ...
    99+
    2021-03-17
    php
  • ./ 和 sh 的区别是什么
    ./ 和 sh 的区别是什么?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。./ 和 sh的使用区别使用“./”执行脚本,对应的xxx.sh脚本必须要有执行权限;使用“sh”...
    99+
    2023-06-09
  • Spring和SpringBoot之间有什么区别
    这篇文章主要介绍了Spring和SpringBoot之间有什么区别,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Spring是什么?简单地说,Spring框架为开发Java应...
    99+
    2023-06-14
  • SpringBoot在容器中创建@Component和@bean的区别是什么
    本篇内容介绍了“SpringBoot在容器中创建@Component和@bean的区别是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!@...
    99+
    2023-07-05
  • php和j2ee的区别是什么
    本文操作环境:Windows10系统、PHP7.1版、Dell G3电脑。php和j2ee的区别是什么J2EE Java 2 Platform ,Enterprise Edition Java 2平台,企业版J2EE可以创建分布式的大型跨平...
    99+
    2020-10-13
    php
  • php4和php5的区别是什么
    本教程操作环境:windows10系统、PHP7.1版、DELL G3电脑php4和php5的区别是什么构造函数和析构函数在 PHP4 中,当函数与对象同名时,这个函数将成为该对象的构造函数,并且在 PHP4 中没有析构函数的概念。在 PH...
    99+
    2015-12-28
    PHP
  • php5.6和php7的区别是什么
    本教程操作环境:windows10系统、PHP7.1版、DELL G3电脑php5.6和php7的区别是什么一、俩者的区别PHP7.0比PHP5.6性能提升了俩倍。PHP7.0全面一致支持64位。PHP7.0之前出现的致命错误,都改成了抛出...
    99+
    2018-06-05
    PHP
  • android和java的区别是什么
    从整体来讲,java和android的区别在于android程序是基于组件和配置的,而且android开发以java语言为开发工具,表面上看他们有点同宗不同门,但实际上区别十分大,android是一个主流智能手机操作系统,java是一种开发...
    99+
    2019-02-19
    java教程 android java 区别
  • c 和java的区别是什么
    Java和C都是指令式语言(Imperative Language),不同的是Java有面向对象(OO)成分在里面,而C是完全面向过程的,C的高级版本C++、C#支持面向对象。另外一个不同是,Java跨平台,既不同的操作系统都可以通过JVM...
    99+
    2019-02-23
    java教程 c java 区别
  • j2ee和java的区别是什么?
    什么是java?java是一种编程语言,java不仅有着c++的优点,还放弃了一些难以理解的名词,目前java是一种面向对象的代表,java语言简单易用,而且功能强大,因此很多程序员使用java编程桌面程序,和嵌入式系统。Java是一种可以...
    99+
    2020-12-18
    java入门 j2ee java
  • js和java的区别是什么?
    Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。js(JavaScript)是一种直译式脚本语言,是一种动态类型、弱类型、基于原型...
    99+
    2015-02-08
    js java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作