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

Rys*_*Rys 203 java spring spring-boot spring-cloud

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

小智 252

我刚刚问过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.

  • 使用Spring Cloud时,通常从服务器加载"真实"配置数据.为了获取URL(以及其他连接配置,例如密码等),您需要更早或"引导"配置.因此,您将配置服务器属性放在bootstrap.yml中,后者用于加载实际配置数据(通常会覆盖application.yml [if present]中的内容). (19认同)
  • 有些时候我想知道当春天带来新的令人兴奋的功能时它会超出规范或者他们假定它已经是惯例而且没有必要指定任何东西,如果不是春天然后春天启动,一切都将自行解决,并且可能在未来的春天 - boot-boot;) (9认同)
  • 你能解释为什么Config Server需要把这些参数放到`bootstrap.yml`中吗? (4认同)

dus*_*ltz 72

bootstrap.yml 要么 bootstrap.properties

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

从文档:

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

请注意,bootstrap.yml或者bootstrap.properties 可以包含其他配置(例如默认值),但通常只需要在此处输入bootstrap配置.

通常它包含两个属性:

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

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

application.yml 要么 application.properties

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


Vai*_*rma 22

这个答案已经在著作"非常漂亮解释微服务的面试问题,对于Java开发人员(春季启动,春季云,云本地应用程序)Munish Chandel,1.30版,2018年3月25日.

以下内容摘自他的书,这个答案的总功劳归于该书的作者,即Munish Chandel

application.yml

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

/src/main/resources/application.yml
Run Code Online (Sandbox Code Playgroud)

您可以在此文件中存储应用程序的所有外部属性.可以在以下位置找到任何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之前加载

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

关于bootstrap.yml的重点

  1. 与Spring Cloud Config服务器一起使用时,您应使用以下属性指定应用程序名称和配置git位置.
spring:
    application:
        name: foobar
    datasource:
        driverClassName: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost/test
server:
    port: 9000
Run Code Online (Sandbox Code Playgroud)
  1. 当与微服务(云配置服务器除外)一起使用时,我们需要使用以下属性指定配置服务器的应用程序名称和位置

spring.application.name: "application-name"
spring.cloud.config.server.git.uri: "git-uri-config"

  1. 此属性文件可以包含与Spring Cloud环境相关的其他配置,例如eureka服务器位置,加密/解密相关属性.

启动时,Spring Cloud使用应用程序的名称向Spring Cloud Config Server发出HTTP(S)调用,并检索该应用程序的配置.

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


Leb*_*cca 7

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

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

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

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

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

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

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

  • 在引导阶段加载配置文件的属性只能放在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
Run Code Online (Sandbox Code Playgroud)

在启动应用程序时,它尝试通过连接到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