What is the difference between putting a property on application.yml or bootstrap.yml in spring boot? In logging.config case, the application works different.
8 Answers
I have just asked the Spring Cloud
guys and thought I should share the info I have here.
bootstrap.yml
is loaded before application.yml
.
It is typically used for the following:
- when using Spring Cloud Config Server, you should specify
spring.application.name
andspring.cloud.config.server.git.uri
insidebootstrap.yml
- some
encryption/decryption
information
Technically, bootstrap.yml
is loaded by a parent Spring ApplicationContext
. That parent ApplicationContext
is loaded before the one that uses application.yml
.
bootstrap.yml
or bootstrap.properties
It's only used/needed if you're using Spring Cloud and your application's configuration is stored on a remote configuration server (e.g. Spring Cloud Config Server).
From the documentation:
A Spring Cloud application operates by creating a "bootstrap" context, which is a parent context for the main application. Out of the box it is responsible for loading configuration properties from the external sources, and also decrypting properties in the local external configuration files.
Note that the bootstrap.yml
or bootstrap.properties
can contain additional configuration (e.g. defaults) but generally you only need to put bootstrap config here.
Typically it contains two properties:
- location of the configuration server (
spring.cloud.config.uri
) - name of the application (
spring.application.name
)
Upon startup, Spring Cloud makes an HTTP call to the config server with the name of the application and retrieves back that application's configuration.
application.yml
or application.properties
Contains standard application configuration - typically default configuration since any configuration retrieved during the bootstrap process will override configuration defined here.
This answer has been very beautifully explained in book "Microservices Interview Questions, For Java Developers (Spring Boot, Spring Cloud, Cloud Native Applications) by Munish Chandel, Version 1.30, 25.03.2018.
The following content has been taken from this book, and total credit for this answer goes to the Author of the book i.e. Munish Chandel
application.yml
application.yml/application.properties file is specific to Spring Boot applications. Unless you change the location of external properties of an application, spring boot will always load application.yml from the following location:
/src/main/resources/application.yml
You can store all the external properties for your application in this file. Common properties that are available in any Spring Boot project can be found at: https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html You can customize these properties as per your application needs. Sample file is shown below:
spring:
application:
name: foobar
datasource:
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost/test
server:
port: 9000
bootstrap.yml
bootstrap.yml on the other hand is specific to spring-cloud-config and is loaded before the application.yml
bootstrap.yml is only needed if you are using Spring Cloud and your microservice configuration is stored on a remote Spring Cloud Config Server.
Important points about bootstrap.yml
- When used with Spring Cloud Config server, you shall specify the application-name and config git location using below properties.
spring.application.name: "application-name" spring.cloud.config.server.git.uri: "git-uri-config"
- When used with microservices (other than cloud config server), we need to specify the application name and location of config server using below properties
spring.application.name: spring.cloud.config.uri:
- This properties file can contain other configuration relevant to Spring Cloud environment for e.g. eureka server location, encryption/decryption related properties.
Upon startup, Spring Cloud makes an HTTP(S) call to the Spring Cloud Config Server with the name of the application and retrieves back that application’s configuration.
application.yml contains the default configuration for the microservice and any configuration retrieved (from cloud config server) during the bootstrap process will override configuration defined in application.yml
Well, I totally agree with answers already exist on this point:
bootstrap.yml
is used to save parameters that point out where the remote configuration is and Bootstrap Application Context is created with these remote configuration.
Actually, it is also able to store normal properties just the same as what application.yml
do. But pay attention on this tricky thing:
- If you do place properties in
bootstrap.yml
, they will get lower precedence than almost any other property sources, including application.yml. As described here.
Let's make it clear, there are two kinds of properties related to bootstrap.yml
:
- Properties that are loaded during the bootstrap phase. We use
bootstrap.yml
to find the properties holder (A file system, git repository or something else), and the properties we get in this way are with high precedence, so they cannot be overridden by local configuration. As described here. - Properties that are in the
bootstrap.yml
. As explained early, they will get lower precedence. Use them to set defaults maybe a good idea.
So the differences between putting a property on application.yml
or bootstrap.yml
in spring boot are:
- Properties for loading configuration files in bootstrap phase can only be placed in
bootstrap.yml
. - As for all other kinds of properties, place them in
application.yml
will get higher precedence.
Just my 2 Cents here ..
Bootstrap.yml or Bootstrap.properties is used to fetch the config from Spring Cloud Server.
For Example, in My Bootstrap.properties file I have the following Config
spring.application.name=Calculation-service
spring.cloud.config.uri=http://localhost:8888
On starting the application , It tries to fetch the configuration for the service by connecting to http://localhost:8888 and looks at Calculation-service.properties present in Spring Cloud Config server
You can validate the same from logs of Calcuation-Service when you start it up
INFO 10988 --- [ restartedMain] c.c.c.ConfigServicePropertySourceLocator : Fetching config from server at : http://localhost:8888
Bootstrap.yml is used to fetch config from the server. It can be for a Spring cloud application or for others. Typically it looks like:
spring:
application:
name: "app-name"
cloud:
config:
uri: ${config.server:http://some-server-where-config-resides}
When we start the application it tries to connect to the given server and read the configuration based on spring profile mentioned in run/debug configuration.
If the server is unreachable application might even be unable to proceed further. However, if configurations matching the profile are present locally the server configs get overridden.
Good approach:
Maintain a separate profile for local and run the app using different profiles.
Another use for bootstrap.yml is to load configuration from kubernetes configmap and secret resources. The application must import the spring-cloud-starter-kubernetes dependency.
As with the Spring Cloud Config, this has to take place during the bootstrap phrase.
From the docs :
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
So properties stored in the configmap resource with meta.name default-name can be referenced just the same as properties in application.yml
And the same process applies to secrets :
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
Bootstrap.yml is the first file loaded when you start spring boot application and application.property is loaded when application starts. So, you keep, may be your config server's credentials etc., in bootstrap.yml which is required during loading application and then in application.properties you keep may be database URL etc.
bootstrap.yml
is as far as I can see specific to [spring-cloud-config
]( cloud.spring.io/spring-cloud-config/…)) and it's the configuration used to find the right configuration. So config there is probably loaded before application.properties/yaml – zapl