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

Posted

技术标签:

【中文标题】在 Spring Boot 中将属性放在 application.yml 或 bootstrap.yml 上有啥区别?【英文标题】:What is the difference between putting a property on application.yml or bootstrap.yml in spring boot?在 Spring Boot 中将属性放在 application.yml 或 bootstrap.yml 上有什么区别? 【发布时间】:2016-01-04 23:41:43 【问题描述】:

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

【问题讨论】:

bootstrap.yml 据我所知是特定于 [spring-cloud-config](cloud.spring.io/spring-cloud-config/…)) 的配置,它是用于找到正确配置的配置。所以配置可能在 application.properties/yaml 之前加载 【参考方案1】:

bootstrap.yml 在您使用 Spring Cloud 并且应用程序的配置存储在远程配置服务器(例如 Spring Cloud Config Server)时使用。 bootstrap.yml 在 application.yml 之前加载

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

bootstrap.yml 的另一个用途是从 kubernetes configmapsecret 资源加载配置。应用程序必须导入 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

【讨论】:

【参考方案4】:

这个答案在“微服务面试问题,Java 开发人员(Spring Boot,Spring Cloud,Cloud 本机应用程序)Munish Chandel,版本 1.30,25.03.2018。

以下内容均取自本书,总学分 因为这个答案属于本书的作者,即 Munish 钱德尔

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 的要点

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

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

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

【讨论】:

【参考方案5】:

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

bootstrap.yml 用于保存指示远程配置所在位置的参数,并使用这些远程配置创建 Bootstrap Application Context

实际上,它也可以像application.yml 一样存储普通属性。但是要注意这个棘手的事情:

如果您确实将属性放在bootstrap.yml 中,它们的优先级将低于几乎任何其他属性源,包括 application.yml。如here所述。

我们说清楚,与bootstrap.yml相关的属性有两种:

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

所以在 Spring Boot 中将属性放在 application.ymlbootstrap.yml 上的区别是:

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

【讨论】:

【参考方案6】:

这里只有我的 2 美分 ..

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

例如,在我的 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

【讨论】:

【参考方案7】:

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

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

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

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

好方法:

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

【讨论】:

【参考方案8】:

bootstrap.ymlbootstrap.properties

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

来自文档:

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

请注意,bootstrap.ymlbootstrap.properties 可以包含其他配置(例如默认值),但通常您只需将引导配置放在这里。

通常它包含两个属性:

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

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

application.ymlapplication.properties

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

【讨论】:

【参考方案9】:

我刚刚问了Spring Cloud 的人,并认为我应该在这里分享我的信息。

bootstrap.ymlapplication.yml 之前加载。

它通常用于以下情况:

使用Spring Cloud Config Server时,应在bootstrap.yml内指定spring.application.namespring.cloud.config.server.git.uri 一些encryption/decryption信息

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

【讨论】:

能否请您解释一下为什么配置服务器需要将这些参数放入bootstrap.yml 使用 Spring Cloud 时,“真实”配置数据通常从服务器加载。为了获取 URL(和其他连接配置,如密码等),您需要更早的或“引导”配置。因此,您将配置服务器属性放在 bootstrap.yml 中,它用于加载真实的配置数据(通常会覆盖 application.yml [如果存在] 中的内容)。 有时我想知道什么时候 spring 带来了新的令人兴奋的特性,它抛弃了约定而不是规范,或者他们假设它已经约定并且不需要指定任何东西,如果不是到 spring 那么一切都将自行解决boot 并且可能在未来 spring-boot-boot ;) 当你说 bootstrap.yml 在 application.yml 之前加载。但是当我删除 application.yml 时。我的应用程序不读取 bootstrap.yml。这是为什么呢? 我们需要强调引导文件永远不会被覆盖,因为它具有更高的优先级。根据文档Team's Spring

以上是关于在 Spring Boot 中将属性放在 application.yml 或 bootstrap.yml 上有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 中将属性注入测试类?

如何在 Wildfly 中将外部属性文件加载到 Spring Boot

如何在 Spring Boot 中将属性文件值读入字符串集

spring boot 引入模板

如何在spring boot中将@Value属性从application.properties注入@InjectMocks?

spring-boot 属性占位符