配置文件
spring boot的默认配置文件在src/main/resources/appliaction.properties
. 可以在application.properties
中添加server.port= 8088
spring.application.name=serviceName来指定端口号与服务名.
spring boot的配置文件除了传统的properties
文件外,还支持广泛推荐的YAML
文件.YAML采用的配置格式不像properties那样以单纯的键值对的形式,而是以类似的大纲缩进的形式.
# YAML配置用例
environments:
dev:
url: http://dev.bar.com
name: Developer Setup
prod:
url: http://foo.bar.com
name: my cool app
# 等价的properties配置
environments.dev.url=http://dev.bar.com
environments.dev.name=Developer Setup
environments.prod.url=http://foo.bar.com
environments.prod.name=my cool app
YAML的配置方式,器结构更加清晰易读,同时配置的字符量也得到显著的减少.除此之外,YAML还可以在单个文件中通过使用spring.properties属性来定义多个不同环境的配置.
在Test环境时,server.port将使用8882端口,而在prod环境中,server.port将使用8883端口,如果没server.port将使用8881端口.
server:
port:8881
---
spring:
profiles: test
server:
port: 8882
---
spring:
profiles: prod
server:
port: 8883
自定义参数
除了可以在spring boot的配置文件中设置各个Starter模块中预定义的配置属性,也可以在配置文件中定义属性.比如在application.properties
中添加:
book.name=SpringCloudApplication
book.author=aaa
# 然后使用@Value注解来加载这些自定义的参数
@Component
public class Book {
@Value("${book.name}")
private String name;
@Value("${book.author}")
private String author;
}
@Value注解加载属性值的时候可以支持两种表达式进行配置
- 一种是上面介绍的placeholder方式,格式为
${...}
,大括号中为placeholder. - 使用SqEL表达式,格式为
#{...}
,大括号内为SqEL表达式.
参数引用
在application.properties中的各个参数之间可以直接通过placeholder的方式进行应用.
book.name=SpringCloud
book.author=wjh
book.desc=${book.author} is write ${book.name}
book.desc参数引用了上文中的定义,最后属性值为wjh is write SpringCloud.
使用随机数
在一些特殊情况下,我们希望有些参数每次加载的时候不是一个固定的值,比如秘钥,服务端口等.在spring boot的属性配置文件中,可以通过**${random}配置来产生随机的int,long或者String字符串**.
# ${random}配置方式参考
# 随机字符串
com.didispace.blog.value=${random.value}
# 随机int
com.didispace.blog.number=${random.int}
# 随机long
com.didispace.blog.bignumber=${random.long}
# 10以内的随机数
com.didispace.blog.test1=${random.int(10)}
# 10~20的随机数
com.didispace.blog.test2=${random.int(10.20)}
命令行参数
可以使用java -jar
来启动spring boot应用时,还可以在命令行中指定的参数,比如java -jar xxx.jar --server.port=8888
,直接以命令行的方式设置server.port属性,并将端口号设为8888.
在用命令行方式启动Spring Boot应用时,连续的两个减号–就是对application.properties中的属性值进行赋值的标识.所以,java -jar xxx.jar --server.port=8888命令,等价于在application.properties
中添加server.port=8888. 通过命令行来修改属性值是spring boot非常重要的一个特性.
多环境配置
在spring boot中,多环境配置文件名需要满足application-{profile},profile
的格式,其中{profile}
对应的为环境标识.
例如:
- application-dev.properties: 开发环境
- application-test.properties: 测试环境
- application-prod.properties: 生产环境
具体配置文件的加载:==需要在application.properties文件中通过spring.profile.active属性来设置,其值对应配置文件中{profile}的值
==,如果配置spring.profile.active=test就会加载application-test.properties配置文件的内容.
以不同环境配置不同的服务端口为例:
- 正对各环境新建不同的配置文件 application-dev.properties application-test.properties application-prod.properties.
- 在这三个配置文件中设置不同的server.port属性,例如dev环境设置为1111,test环境设置为2222,prod环境设置为3333.
- application.properties中设置spring.profile.active=dev,以为默认dev环境设置.
- 测试不同配置的加载.
- 执行
java -jar xxx.jar
,可以观察到服务端口被设置为1111,也就是默认的dev环境. - 执行
java -jar xxx.jar --spring.profile.active=test
,可以观察到服务器端口被设置为2222,也就是测试环境. - 执行java -jar xxx.jar --spring.profile.active=prod
,可以观察到服务器端口被设置为3333,也就是生产环境.
多环境配置的思路: - 在application.properties中配置通用内容,并设置spring.profile.active=dev,已开发环境为默认.
- 在application-{profile}.properties中配置各个环境不同的内容.
- 通过命令行方式激活不同环境的配置.
加载顺序
为了能够更合理的重写各属性的值,spring boot使用了下面这种较为特别的属性加载顺序:
- 在命令行中传入参数
- SPRING_APPILCATION_JSON中的属性.SPRING_APPILCATION_JSON是以JSON格式配置在系统环境变量中的内容.
- java:comp/env中的JNDI属性
- Java的系统属性,可以通过System.getProperties()获得内容.
- 操作系统环境变量
- 通过random.*配置的随机属性.
- 位于当前应用jar包之外,针对不同{profile}环境的配置文件内容,例如applica-{profil}.properties或者是YAML定义的配置文件.
- 位于应用jar包内,针对不同的{profile}环境的配置文件内容,例如applica-{profil}.properties或者是YAML定义的配置文件.
- 位于当前jar包之外的application.properties和YAML配置内容.
- 位于当前jar包之内的application.properties和YAML配置内容.
- 在@Configuration注解修改的类中,通过@PropertySource注解定义的属性.
- 应用默认属性,使用SpringApplication.setDefaultProperties定义的内容.
优先级按上面顺序由高到底,数字越小优先级越高.
第七项与第九项都是从jar包之外读取配置文件,所以实现外部化配置的原理就是从此切入,为其指定外部配置文件的加载来取代jar包内的配置内容.