Spring Boot外化配置

阅读: 评论:0

Spring Boot外化配置

Spring Boot外化配置

23.外化配置

Spring Boot允许外化(externalize)你的配置,这样你能够在不同的环境下使用相同的代码。你可以使用properties文件,YAML文件,环境变量和命令行参数来外化配置。使用@Value注解,可以直接将属性值注入到你的beans中,并通过Spring的Environment抽象或绑定到结构化对象来访问。

Spring Boot使用一个非常特别的PropertySource次序来允许对值进行合理的覆盖,需要以下面的次序考虑属性:

  1. 命令行参数
  2. 来自于java:comp/env的JNDI属性
  3. Java系统属性&#Properties())
  4. 操作系统环境变量
  5. 只有在random.*里包含的属性会产生一个RandomValuePropertySource
  6. 在打包的jar外的应用程序配置文件(application.properties,包含YAML和profile变量)
  7. 在打包的jar内的应用程序配置文件(application.properties,包含YAML和profile变量)
  8. 在@Configuration类上的@PropertySource注解
  9. 默认属性(使用SpringApplication.setDefaultProperties指定)

下面是一个具体的示例(假设你开发一个使用name属性的@Component):

import org.springframework.stereotype.*
import org.springframework.beans.factory.annotation.*@Component
public class MyBean {@Value("${name}")private String name;// ...
}

你可以将一个application.properties文件捆绑到jar内,用来提供一个合理的默认name属性值。当运行在生产环境时,可以在jar外提供一个application.properties文件来覆盖name属性。对于一次性的测试,你可以使用特定的命令行开关启动(比如,java -jar app.jar --name=“Spring”)。

23.1. 配置随机值

RandomValuePropertySource在注入随机值(比如,密钥或测试用例)时很有用。它能产生整数,longs或字符串,比如:

my.secret=${random.value}
my.number=${random.int}
my.bignumber=${random.long}
my.number.=${random.int(10)}
my.number.in.range=${random.int[1024,65536]}

random.int*语法是OPEN value (,max) CLOSE,此处OPEN,CLOSE可以是任何字符,并且value,max是整数。如果提供max,那么value是最小的值,max是最大的值(不包含在内)。

23.2. 访问命令行属性

默认情况下,SpringApplication将任何可选的命令行参数(以’–'开头,比如,–server.port=9000)转化为property,并将其添加到Spring Environment中。如上所述,命令行属性总是优先于其他属性源。

如果你不想将命令行属性添加到Environment里,你可以使用SpringApplication.setAddCommandLineProperties(false)来禁止它们。

23.3. Application属性文件

SpringApplication将从以下位置加载application.properties文件,并把它们添加到Spring Environment中:

  1. 当前目录下的一个/config子目录
  2. 当前目录
  3. 一个classpath下的/config包
  4. classpath根路径(root)

这个列表是按优先级排序的(列表中位置高的将覆盖位置低的)。

:你可以使用YAML(‘.yml’)文件替代’.properties’。

如果不喜欢将application.properties作为配置文件名,你可以通过指定fig.name环境属性来切换其他的名称。你也可以使用fig.location环境属性来引用一个明确的路径(目录位置或文件路径列表以逗号分割)。

$ java -jar myproject.jar --fig.name=myproject
//or
$ java -jar myproject.jar --fig.location=classpath:/default.properties,classpath:/override.properties

如果fig.location包含目录(相对于文件),那它们应该以/结尾(在加载前&#fig.name产生的名称将被追加到后面)。不管fig.location是什么值,默认的搜索路径classpath:,classpath:/config,file:,file:config/总会被使用。以这种方式,你可以在application.properties中为应用设置默认值,然后在运行的时候使用不同的文件覆盖它,同时保留默认配置。

:如果你使用环境变量而不是系统配置,大多数操作系统不允许以句号分割(period-separated)的key名称,但你可以使用下划线(underscores)代替(比如,使用SPRING_CONFIG_NAME代替fig.name)。如果你的应用运行在一个容器中,那么JNDI属性(java:comp/env)或servlet上下文初始化参数可以用来取代环境变量或系统属性,当然也可以使用环境变量或系统属性。

23.4. 特定的Profile属性

除了application.properties文件,特定配置属性也能通过命令惯例application-{profile}.properties来定义。特定Profile属性从跟标准application.properties相同的路径加载,并且特定profile文件会覆盖默认的配置。

23.5. 属性占位符

当application.properties里的值被使用时,它们会被存在的Environment过滤,所以你能够引用先前定义的值(比如,系统属性)。

app.name=MyApp
app.description=${app.name} is a Spring Boot application

:你也能使用相应的技巧为存在的Spring Boot属性创建’短’变量,具体参考[Section 63.3, “Use ‘short’ command line arguments”](…/IX. ‘How-to’ guides/63.3. Use ‘short’ command line arguments.md)。

本文发布于:2024-01-29 00:35:08,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170645971311441.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:Spring   Boot
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23