Spring Boot允许外化(externalize)你的配置,这样你能够在不同的环境下使用相同的代码。你可以使用properties文件,YAML文件,环境变量和命令行参数来外化配置。使用@Value注解,可以直接将属性值注入到你的beans中,并通过Spring的Environment抽象或绑定到结构化对象来访问。
Spring Boot使用一个非常特别的PropertySource次序来允许对值进行合理的覆盖,需要以下面的次序考虑属性:
下面是一个具体的示例(假设你开发一个使用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”)。
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是最大的值(不包含在内)。
默认情况下,SpringApplication将任何可选的命令行参数(以’–'开头,比如,–server.port=9000)转化为property,并将其添加到Spring Environment中。如上所述,命令行属性总是优先于其他属性源。
如果你不想将命令行属性添加到Environment里,你可以使用SpringApplication.setAddCommandLineProperties(false)来禁止它们。
SpringApplication将从以下位置加载application.properties文件,并把它们添加到Spring Environment中:
这个列表是按优先级排序的(列表中位置高的将覆盖位置低的)。
注:你可以使用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上下文初始化参数可以用来取代环境变量或系统属性,当然也可以使用环境变量或系统属性。
除了application.properties文件,特定配置属性也能通过命令惯例application-{profile}.properties来定义。特定Profile属性从跟标准application.properties相同的路径加载,并且特定profile文件会覆盖默认的配置。
当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小时内删除。
留言与评论(共有 0 条评论) |