application.properties 配置

深坑

spring boot 通过 pom.xml 中引入模块化的,使得常规的开发场景可以很快把应用搭建起来,除此之外一些项目相关的配置也可以在 application.properties 中通过配置来完成。

一般属性使用

如我们配置程序的端口、名字等,这类一般属性配置后是直接可以被 Spring Boot 识别使用的,如:

spring.application.name=fly
server.port=80
server.tomcat.uri-encoding=GBK

自定义属性

跟一般属性类似,可以通过如下定义我们自己的属性,如:

com.isyxf.title=Y.jer
com.isyxf.url=https://www.isyxf.com

但是这种自定义的属性需要通过 @Value 注解才能让 spring boot 识别:

@RestContorller public class HelloController { @Value("${com.isyxf.title}") private String title; @Value("${com.isyxf.url}") private String url; @GetMapping("/user") public String info() { return title + url } }

属性映射到类中

@Configuration @ConfigurationProperties(prefix="com.isyxf") public class ConfigBean { private String title; public String getTitle() { return title } public void setTitle(String title) { this.title = title } }
@RestContorller @EnableConfigurationProperties({ConfigBean.class}) public class HelloController { @Autowired ConfigBean configBean; @GetMapping("/user2") public String info() { return configBean.getTitle() } }

@Configuration 用于定义配置类,可替换xml配置文件,

参数引用

application.properties 中定义的属性可以直接被其他配置引用

com.isyxf.title=Y.jer com.isyxf.url=https://www.isyxf.com # 引用 com.isyxf.info=${com.isyxf.title}的地址是${com.isyxf.url}

使用随机数

很多情况下,有些参数并不能是一个固定的值,如秘钥、服务器端口等,Spring Boot 的属性配置文件可以 ${random}来产生int值、long值或者string字符串来支持。

# 随机字符串 com.isyxf.stringValue=${random.value} # 随机int com.isyxf.numberValue=${random.int} # 随机long com.isyxf.bigNumberValue=${random.long} # 10以内的随机数 com.isyxf.randomValue0=${random.int(10)} # 10-20的随机数 com.isyxf.randomValue2=${random.int[10,20]}

命令行替代 application.properties

使用过Spring Boot的用户,对 java -jar xxx.jar --server.port=8888 这条命令很清楚,它是通过使用 -server.port 属性类设置xxx.jar应用的端口为8888。

在命令行运行时,连续的两个减号"–" 就是对 application.properties 中的属性值进行赋值标识,所以等价于 application.properties 中添加属性 server.port=8888。

通过命令行来修改属性值提供了便利性,但也很不安全。因此 Spring Boot 也贴心的提供了屏蔽命令行访问属性的设置,只需这句设置就能屏蔽:SpringApplication.setAddCommandLineProperties(false)

多环境配置

在开发Spring Boot应用时,通常同一套程序会被应用和安装到不同的环境,如:开发、测试、预发、生产等,其中每个环境对应的数据库地址、端口等配置都有所不同。如果在为不同环境打包都要频繁修改配置文件的话,那必然是非常繁琐且容易发生错误的事。

在Spring Boot中多环境配置文件名需要满足application-{profile}.properties的格式,其中 {profile} 对应你的环境标识。如:

  • application-dev.properties: 开发环境
  • application-test.properties: 测试环境
  • application-prod.properties: 生产环境

至于哪个具体的配置文件会被加载,需要在 application.properties 文件中 spring.profiles.active 属性来设置,其中值对应 ${profile}值,如: spring.profiles.avtive=test 就会记载 application-test.properties 配置文件内容。

配置文件的优先级

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

当前目录下的/config子目录 > 当前目录 > classpath下的/config包 > classpath跟路径

此外,如果项目同时存在 application.properties 和 application.yml ,那么 application.yml 里面的属性就会覆盖 application.properties 里的属性。

参考地址