在Spring Boot中将属性放在application.yml或bootstrap.yml上有什么区别?


250

在Spring Boot中将属性放在application.yml或bootstrap.yml上有什么区别?在logging.config情况下,应用程序的工作方式有所不同。


14
bootstrap.yml 据我所见,具体到[ spring-cloud-config](cloud.spring.io/spring-cloud-config/…)),它是用来找到正确配置的配置。因此,配置可能在application.properties/yaml之前加载
zapl 2015年

Answers:


294

我刚刚问过Spring Cloud这些人,以为我应该在这里分享我的信息。

bootstrap.yml之前已加载application.yml

通常用于以下用途:

  • 使用Spring云配置服务器时,您应指定spring.application.namespring.cloud.config.server.git.uribootstrap.yml
  • 一些encryption/decryption信息

从技术上讲,bootstrap.yml是由父Spring加载的ApplicationContext。该父ApplicationContext对象在使用之前被加载application.yml


6
您能否解释为什么Config Server需要将这些参数放入bootstrap.yml
2016年

30
使用Spring Cloud时,通常从服务器加载“实际”配置数据。为了获取URL(以及其他连接配置,例如密码等),您需要较早的配置或“ bootstrap”配置。因此,您将配置服务器属性放入bootstrap.yml中,该属性用于加载实际的配置数据(通常会覆盖application.yml中的内容[如果存在])。
Mike Mansell

10
有时候,我想知道当春季带来新的令人兴奋的功能时,它会超出规范,而不是遵循惯例,或者它们假设它已经是惯例,无需指定任何内容,并且如果不是在春季启动时才自行解决所有问题,则可能会在春季启动- boot-boot;)
Saurabh

当您说bootstrap.yml加载在application.yml之前。但是当我删除application.yml时。我的应用程序未读取bootstrap.yml。这是为什么?
杰西

我们需要强调的是,引导文件永远不会被覆盖,因为它具有更高的优先级。根据文档团队的春季报告
kelgwiin

84

bootstrap.yml 要么 bootstrap.properties

仅当您使用Spring Cloud且应用程序的配置存储在远程配置服务器(例如Spring Cloud Config Server)上时,才使用/需要它。

从文档中:

Spring Cloud应用程序通过创建“引导”上下文来运行,该上下文是主应用程序的父上下文。开箱即用的是它负责从外部源加载配置属性,并负责解密本地外部配置文件中的属性。

请注意 bootstrap.ymlbootstrap.properties 可以包含其他配置(例如,默认设置),但是通常您只需要在此处放入bootstrap config。

通常,它包含两个属性:

  • 配置服务器的位置(spring.cloud.config.uri
  • 应用程序名称(spring.application.name

启动后,Spring Cloud使用应用程序的名称对配置服务器进行HTTP调用,并检索该应用程序的配置。

application.yml 要么 application.properties

包含标准应用程序配置-通常为默认配置,因为在引导过程中检索到的任何配置都将覆盖此处定义的配置。


34

Munish Chandel1.30,25.03.2018版的《面向Java开发人员的微服务面试问题(Spring Boot,Spring Cloud,Cloud Native Applications)》中这一答案进行了非常漂亮的解释。

本书摘录了以下内容,该答案的总贡献归功于该书的作者,即Munish Chandel

application.yml

application.yml / application.properties文件特定于Spring Boot应用程序。除非您更改应用程序外部属性的位置,否则Spring Boot将始终从以下位置加载application.yml

/src/main/resources/application.yml

您可以将应用程序的所有外部属性存储在此文件中。可以在以下任何位置找到任何Spring Boot项目中可用的公共属性:https : //docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html您可以将这些属性自定义为根据您的应用程序需求。示例文件如下所示:

spring:
    application:
        name: foobar
    datasource:
        driverClassName: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost/test
server:
    port: 9000

bootstrap.yml

另一方面,bootstrap.yml特定于spring-cloud-config,并且在application.yml之前加载

bootstrap.yml仅当您使用的是Spring Cloud并且您的微服务配置存储在远程Spring Cloud Config Server上时,才需要。

有关bootstrap.yml的要点

  1. 当与Spring Cloud Config服务器一起使用时,您应使用以下属性指定应用程序名称和config git位置。
spring.application.name:“应用程序名称”
spring.cloud.config.server.git.uri:“ git-uri-config”

  1. 与微服务(云配置服务器除外)一起使用时,我们需要使用以下属性指定应用程序名称和配置服务器的位置
spring.application.name: 
spring.cloud.config.uri: 
  1. 该属性文件可以包含与Spring Cloud环境相关的其他配置,例如eureka服务器位置,与加密/解密相关的属性。

启动后,Spring Cloud使用应用程序的名称对Spring Cloud Config Server进行HTTP(S)调用,并检索该应用程序的配置。

application.yml包含微服务的默认配置,并且在引导过程中从云配置服务器检索到的任何配置都将覆盖application.yml中定义的配置。


5

这里只有我的两分钱..

Bootstrap.yml或Bootstrap.properties用于从Spring Cloud Server获取配置。

例如,在My Bootstrap.properties文件中,我具有以下配置

spring.application.name=Calculation-service
spring.cloud.config.uri=http://localhost:8888

在启动应用程序时,它将尝试通过连接到http:// localhost:8888来获取服务的配置。并查看Spring Cloud Config服务器中存在的Calculation-service.properties。

您可以在启动Calcuation-Service日志时验证它

INFO 10988 --- [ restartedMain] c.c.c.ConfigServicePropertySourceLocator : Fetching config from server at : http://localhost:8888


4

好吧,我完全同意在这一点上已经存在的答案:

  • bootstrap.yml用于保存指出远程配置位置的参数,并使用这些远程配置创建Bootstrap应用程序上下文

实际上,它也可以存储与操作相同的普通属性application.yml。但是请注意以下棘手的问题:

  • 如果将属性放在中bootstrap.yml,则它们的优先级将比几乎所有其他属性源(包括application.yml)低。如上所述这里

让我们弄清楚,有两种与之相关的属性bootstrap.yml

  • 在引导阶段加载的属性。我们bootstrap.yml用来查找属性持有者(文件系统,git存储库或其他东西),并且通过这种方式获得的属性具有较高的优先级,因此它们不能被本地配置覆盖。如上所述这里
  • 中的属性bootstrap.yml。如前所述,它们将获得较低的优先级。使用它们来设置默认值可能是一个好主意。

因此,在Spring Boot 上application.ymlbootstrap.yml在Spring Boot 上放置属性之间的区别是:

  • 在引导阶段加载配置文件的属性只能放在中bootstrap.yml
  • 至于所有其他种类的属性,将它们放在application.yml更高优先级。

3

Bootstrap.yml用于从服务器获取配置。它可以用于Spring云应用程序或其他应用程序。通常看起来像:

spring:
  application:
    name: "app-name"
  cloud:
    config:
      uri: ${config.server:http://some-server-where-config-resides}

当我们启动应用程序时,它会尝试连接到给定的服务器,并根据运行/调试配置中提到的spring配置文件读取配置。 bootstrap.yml加载第一个

如果服务器无法访问,则应用程序甚至可能无法继续进行。但是,如果本地存在与配置文件匹配的配置,则服务器配置将被覆盖。

好的方法:

为本地维护一个单独的配置文件,并使用不同的配置文件运行应用程序。


1

bootstrap.yml的另一个用途是从kubernetes configmap秘密资源加载配置。该应用程序必须导入spring-cloud-starter-kubernetes依赖项。

与Spring Cloud Config一样,这必须在引导阶段执行。

从文档:

spring:
  application:
    name: cloud-k8s-app
  cloud:
    kubernetes:
      config:
        name: default-name
        namespace: default-namespace
        sources:
         # Spring Cloud Kubernetes looks up a ConfigMap named c1 in namespace default-namespace
         - name: c1

因此,可以将与meta.name default-name一起存储在configmap资源中的属性引用为与application.yml中的属性相同

同样的过程也适用于机密:

spring:
  application:
    name: cloud-k8s-app
  cloud:
    kubernetes:
      secrets:
        name: default-name
        namespace: default-namespace
        sources:
         # Spring Cloud Kubernetes looks up a Secret named s1 in namespace default-namespace
         - name: s1

0

Bootstrap.ymal是启动spring boot应用程序时加载的第一个文件,而application.property是在应用程序启动时加载的。因此,您保留的可能是bootstrap.ymal中的配置服务器凭据,这是在加载应用程序时所需的,然后在application.properties中保留的可能是数据库url等。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.