Spring Boot配置相关

配置文件

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使用了下面这种较为特别的属性加载顺序:

  1. 在命令行中传入参数
  2. SPRING_APPILCATION_JSON中的属性.SPRING_APPILCATION_JSON是以JSON格式配置在系统环境变量中的内容.
  3. java:comp/env中的JNDI属性
  4. Java的系统属性,可以通过System.getProperties()获得内容.
  5. 操作系统环境变量
  6. 通过random.*配置的随机属性.
  7. 位于当前应用jar包之外,针对不同{profile}环境的配置文件内容,例如applica-{profil}.properties或者是YAML定义的配置文件.
  8. 位于应用jar包内,针对不同的{profile}环境的配置文件内容,例如applica-{profil}.properties或者是YAML定义的配置文件.
  9. 位于当前jar包之外的application.properties和YAML配置内容.
  10. 位于当前jar包之内的application.properties和YAML配置内容.
  11. 在@Configuration注解修改的类中,通过@PropertySource注解定义的属性.
  12. 应用默认属性,使用SpringApplication.setDefaultProperties定义的内容.
    优先级按上面顺序由高到底,数字越小优先级越高.
    第七项与第九项都是从jar包之外读取配置文件,所以实现外部化配置的原理就是从此切入,为其指定外部配置文件的加载来取代jar包内的配置内容.

你可能感兴趣的:(Spring Boot配置相关)