Spring Boot vous permet d'externaliser la configuration afin que vous puissiez utiliser le même code d'application dans différents environnements. Vous pouvez utiliser diverses sources de configuration externes, notamment des fichiers de propriétés Java, des fichiers YAML, des variables d'environnement et des paramètres de ligne de commande.
Les valeurs de propriété peuvent être injectées directement dans vos beans à l'aide de l'annotation @Value, accessibles via l'environnement de Spring ou liées à des objets via @ConfigurationProperties. Dans le même temps, Spring Boot fournit également un PropertyOrder très spécial pour permettre aux utilisateurs de remplacer certaines valeurs de propriété dans des scénarios appropriés. Cet ordre est conçu pour permettre un remplacement raisonnable des valeurs.
La priorité est de faible à élevée dans l'ordre suivant. La valeur de propriété de cette dernière remplace la première Toutes les configurations formeront des configurations complémentaires :
Propriétés par défaut (spécifiées à l'aide de SpringApplication.setDefaultProperties )
Les propriétés de configuration introduites par l'annotation @PropertySource
sur la classe @Configuration
@Configuration
类上的@PropertySource
注解引入的配置属性
请注意,这样的属性源直到ApplicationContext
被刷新时才会被添加到环境中。这对于配置某些属性来说已经太晚了,比如logging.*
和spring.main.*
,它们在刷新开始前就已经被读取了。
配置数据(例如application.properties文件)
对于random.*
形式的属性,优先从RandomValuePropertySource
获取(指优先于后者)
OS environment variables((操作系统环境变量)
Java System properties(Java 系统属性System.getProperties()
)
JNDI 属性
ServletContext 的 初始化参数
ServletConfig 的 初始化参数
SPRING_APPLICATION_JSON 属性
命令行参数
test 模块下的 properties 属性
test 模块下 @TestPropertySource 注解引入的配置文件
启用 devtools 时 $HOME/.config/spring-boot 路径下的配置
配置数据文件按以下加载顺序考虑:
打包在 jar 中的应用程序属性(application.properties 和 YAML)
打包在 jar 中的特定配置文件的应用程序属性(application-{profile}.properties 和 YAML)
打包 jar 之外的应用程序属性(application.properties 和 YAML)
打包 jar 之外的特定配置文件的应用程序属性(application-{profile}.properties 和 YAML)
XML资源
Properties资源
YAML资源
Profile 本质上代表一种用于组织配置信息的维度,在不同场景下可以代表不同的含义。例如,如果 Profile 代表的是一种状态,我们可以使用 open、halfopen、close 等值来分别代表全开、半开和关闭等。再比如系统需要设置一系列的模板,每个模板中保存着一系列配置项。
配置命名规则:
/{application}.yml /{application}-{profile}.yml /{label}/{application}-{profile}.yml /{application}-{profile}.properties /{label}/{application}-{profile}.properties
Spring Boot 启动时,会自动加载 JAR 包内部及 JAR 包所在目录指定位置的配置文件(Properties 文件、YAML 文件)。列表按优先级排序(较低项目的值覆盖较早项目的值)
classpath( –classpath )
classpath 根路径
classpath 下的 /config 包
当前目录( –file )
当前目录下
当前目录下的 config/ 子目录
当前目录下的 config/ 子目录的直接子目录
. project-sample ├── config │ ├── application.yml (4) │ └── src/main/resources | │ ├── application.yml (1) | │ └── config | | │ ├── application.yml (2) ├── application.yml (3)
启动时加载配置文件顺序:1 > 2 > 3 > 4
2.4.0
以前版本,默认情况的加载顺序如下:
打包在 jar 中的应用程序属性(application.properties 和 YAML)。
打包 jar 之外的应用程序属性(application.properties 和 YAML)
打包在 jar 中的特定于配置文件的应用程序属性(application-{profile}.properties 和 YAML)
打包 jar 之外的特定于配置文件的应用程序属性(application-{profile}.properties 和 YAML)
注意:在之前的版本中,JAR 包外部的application.properties
配置文件不会覆盖 JAR 包里面的基于 "profile" 的application-{profile}.properties
配置文件。
2.4.0
ApplicationContext
n'est pas actualisé. Il est trop tard pour configurer certaines propriétés, telles que logging.*
et spring.main.*
, qui ont déjà été lues avant le début de l'actualisation. random.*
, la priorité est donnée à RandomValuePropertySource
Obtenir (en faisant référence à la priorité sur cette dernière) System.getProperties())
spring: profiles: active: dev #激活开发环境配置
$ java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties#🎜🎜#Loading séquence du fichier de configuration au démarrage : 1 > 2 > 3 > 4#🎜🎜#Modifications de la couverture de configuration du profil (après 2.4.0)#🎜🎜#
2.4.0
Pour les versions précédentes, l'ordre de chargement par défaut est le suivant : #🎜🎜##🎜🎜##🎜 🎜##🎜🎜# Propriétés de l'application (application.properties et YAML) conditionnées en jar. #🎜🎜##🎜🎜##🎜🎜##🎜🎜#Propriétés de l'application du package (application.properties et YAML) en dehors du pot #🎜🎜##🎜🎜##🎜🎜##🎜🎜#Package dans le profil jar- propriétés d'application spécifiques dans (application-{profile}.properties et YAML)#🎜🎜##🎜🎜##🎜🎜##🎜🎜#Propriétés d'application spécifiques au profil en dehors du fichier jar packagé (application-{profile}.properties et YAML) #🎜🎜##🎜🎜##🎜🎜#Remarque : Dans les versions précédentes, la configuration application.properties
en dehors du package JAR Le fichier n'écrasera pas le fichier basé sur le "profil" Fichier de configuration application-{profile}.properties
dans le package JAR. #🎜🎜##🎜🎜#2.4.0
et versions ultérieures, l'ordre de recherche par défaut est le suivant : garantir que les paramètres d'application en dehors du package JAR doivent avoir priorité sur les paramètres de configuration d'activation spécifiques à l'intérieur du package JAR # 🎜🎜##🎜🎜##🎜🎜##🎜🎜# Propriétés de l'application (application.properties et YAML) conditionnées dans un pot. #🎜🎜##🎜🎜##🎜🎜##🎜🎜#Propriétés d'application spécifiques au profil (application-{profile}.properties et YAML) conditionnées dans un pot #🎜🎜##🎜🎜##🎜 🎜##🎜🎜 #Propriétés de l'application (application.properties et YAML) en dehors du pot emballé#🎜🎜#打包 jar 之外的特定于配置文件的应用程序属性(application-{profile}.properties 和 YAML)
注意:同一位置下,Properties 文件优先级高于 YAML 文件 , 如果Spring Boot在优先级更高的位置找到了配置,那么它就会无视优先级低的配置。
从 Spring Boot 2.4 开始,加载 Properties 和 YAML 文件时候会遵循, 在文档中声明排序靠前的属性将被靠后的属性覆盖 。
命令行激活: --spring.profiles.active=prod
spring: profiles: active: dev #激活开发环境配置
配置文件激活如上,只需要在application.yml或者properties文件中配置即可
注意:在application.yml或者properties文件存在的情况下,不管激活的是prod还是dev,还是会读取默认的配置文件,只不过指定的配置文件会覆盖默认配置文件中的属性
可以使用spring.config.import
属性从其他地方导入更多的配置数据,比如spring.config.import=my.yaml
。它会将 my.yaml 文件作为临时文件放在当前配置文件之后处理,因此其属性具有更高的优先级
在运行Jar
包的命令中加入这个参数就可以指定Jar
包以外的配置文件的位置了,也可以在application的配置文件中配置该属性
$ java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties
这个参数就是指定外部application.yml
配置文件位置的参数,它支持classpath
和file
路径
java -jar myproject.jar --spring.config.name=myproject
如果您不喜欢application.properties
作为配置文件名,您可以通过指定spring.config.name
环境属性来切换到另一个文件名
对于spring.config.location
、spring.config.additional-location
和spring.config.import
等属性的路径,添加optional:
前缀,则当对应文件不存在时应用仍可以正常启动
比如spring.config.location=optional:file:/my.yaml
,当应用启动加载文件 my.yaml 不存在时,不会抛出异常
例如,如果想要获取当前应用程序的名称并作为一个配置项进行管理,那么很简单,我们直接通过 ${spring.application.name} 占位符:
myapplication.name : ${spring.application.name}
假设我们使用 Maven 来构建应用程序,那么可以按如下所示的配置项来动态获取与系统构建过程相关的信息:
info: app: encoding: @project.build.sourceEncoding@ java: source: @java.version@ target: @java.version@ # 等同于下述效果 info: app: encoding: UTF-8 java: source: 1.8.0_31 target: 1.8.0_31
additional-spring-configuration-metadata.json
、spring-configuration-metadata.json
在springboot-starter官方项目或第三方starter项目中随处可见,那它起的作用是什么?
配置additional-spring-configuration-metadata.json
文件后,在开发人员的IDE工具使用个人编写的配置读取很有效的在application.properties
或application.yml
文件下完成提示
在Maven中,该依赖关系应被声明为可选的,如以下例子所示。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
在resources/META-INF
目录下创建additional-spring-configuration-metadata.json
,分类为 “groups” 或 “properties”,附加值提示分类为 "hints",如以下例子所示:
{ "groups": [ { "name": "server", "type": "org.springframework.boot.autoconfigure.web.ServerProperties", "sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties" }, { "name": "spring.jpa.hibernate", "type": "org.springframework.boot.autoconfigure.orm.jpa.JpaProperties$Hibernate", "sourceType": "org.springframework.boot.autoconfigure.orm.jpa.JpaProperties", "sourceMethod": "getHibernate()" } ... ], "properties": [ { "name": "server.port", "type": "java.lang.Integer", "sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties" }, { "name": "server.address", "type": "java.net.InetAddress", "sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties" }, { "name": "spring.jpa.hibernate.ddl-auto", "type": "java.lang.String", "description": "DDL mode. This is actually a shortcut for the "hibernate.hbm2ddl.auto" property.", "sourceType": "org.springframework.boot.autoconfigure.orm.jpa.JpaProperties$Hibernate" } ... ], "hints": [ { "name": "spring.jpa.hibernate.ddl-auto", "values": [ { "value": "none", "description": "Disable DDL handling." }, { "value": "validate", "description": "Validate the schema, make no changes to the database." }, { "value": "update", "description": "Update the schema if necessary." }, { "value": "create", "description": "Create the schema and destroy previous data." }, { "value": "create-drop", "description": "Create and then destroy the schema at the end of the session." } ] } ] }
properties 数组中包含的JSON对象可以包含下表中描述的属性。
Nom | Type | Objectif |
---|---|---|
String | Le nom complet de l'attribut. Le nom est en minuscules, séparé par des points (par exemple, server.address). Cet attribut est obligatoire. | |
String | La signature complète du type de données de la propriété (par exemple, java.lang. String ), mais il existe également des types génériques complets (par exemple java.util.Map | |
String | Une brève description de la propriété qui peut être affichée à l'utilisateur. S'il n'y a pas de description, elle peut être omise. La dernière ligne de la description doit se terminer par un point (.). | |
String | Le nom de classe de la source qui a contribué à cette propriété. Par exemple, si la propriété provient d'une classe annotée avec @ConfigurationProperties, la propriété contiendra le nom complet de la classe. Peut être omis si le type de source est inconnu. | |
Object | Valeur par défaut, si cet attribut n'est pas spécifié, cette valeur est utilisée. Si le type de la propriété est un tableau, il peut s'agir d'un tableau de valeurs. Si la valeur par défaut est inconnue, elle peut être omise. | |
Deprecation | Spécifie si cet attribut est obsolète. Si ce champ n'est pas obsolète, ou si cette information n'est pas connue, elle peut être omise. Le tableau suivant fournit plus de détails sur l'attribut de dépréciation. |
Type | Objectif | #🎜🎜 # |
---|---|---|
String | Le nom complet de la propriété pointée par cette astuce. Le nom est en minuscules, séparés par des points (comme spring.mvc.servlet.path). Cet attribut est obligatoire. | |
ValueHint[] | La liste des valeurs valides définies par l'objet ValueHint (décrit dans le tableau suivant). Chaque entrée a une valeur définie et peut avoir une description. |
Type | Objectif | #🎜🎜 # | value
---|---|---|
Une valeur valide pour l'élément pointé par l'indice. Si le type de la propriété est un tableau, il peut également s'agir d'une valeur de tableau. Cet attribut est obligatoire. | description | |
Une brève description de la valeur qui peut être affichée à l'utilisateur. S'il n'y a pas de description, elle peut être omise. La dernière ligne de la description doit se terminer par un point (.). |
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!