第01章 Spring-Boot 应用文件application配置
文章目录
前言
-
为什么要使用 Spring-Boot?
可参考官方文档。
-
什么是 Spring-Boot?
可参考官方文档说明。
-
官方地址
https://spring.io/projects/spring-boot
目标
- 完成 Jenkins 在 Docker 中的安装与配置。
- 安装在 Docker 中的 Jenkins 能正常对外提供服务。
- 在外部开发环境中能正常访问和使用 Jenkins 持续集成服务。
环境
-
**VMware:**VMware Workstation 14 Pro
-
**Linux:**CentOS7.4
-
**Docker:**18.06.0-ce, build 0ffa825
-
**Jenkins:**Jenkins2.121.1
-
**JDK:**jdk1.8.0_172
-
**Spring-Boot:**2.0.4
-
**Eclipse:**Eclipse Neon.3 (4.6.3)
-
spring-tool-suite:
Version: 3.8.4.RELEASE
Build Id: 201703310825
Platform: Eclipse Neon.3 (4.6.3) -
**Maven:**3.5.0
随机值配置
xxx.secret=${random.value}
xxx.number=${random.int}
xxx.bignumber=${random.long}
xxx.number.less.than.ten=${random.int(10)}
xxx.number.in.range=${random.int[1024,65536]}
在应用代码中可以使用注解读取:@Value(value = "${xxx.secret}")
注:出现黄点提示,是要提示配置元数据,可以不配置
属性占位符
当application.properties里的值被使用时,它们会被存在的Environment过滤,所以你能够引用先前定义的值(比如,系统属性)。
xxx.name=www.google.com
xxx.desc=${xxx.name} is a domain name
应用配置文件加载顺序
Application配置文件,加载按优先级排序,位置高的将覆盖位置低的
-
当前目录下的一个/config子目录
-
当前目录
-
一个classpath下的/config包
-
classpath根路径(root)
这个列表是按优先级排序的(列表中位置高的将覆盖位置低的)
应用配置文件键值对覆盖
应用配置文件的加载顺序,相同的键值对会对值进行覆盖,后面的会覆盖前面的。
- @TestPropertySource 注解
- 命令行参数
- Java系统属性(System.getProperties())
- 操作系统环境变量
- 只有在random.*里包含的属性会产生一个RandomValuePropertySource
- 在打包的jar外的应用程序配置文件(application.properties,包含YAML和profile变量)
- 在打包的jar内的应用程序配置文件(application.properties,包含YAML和profile变量)
- 在@Configuration类上的@PropertySource注解
- 默认属性(使用SpringApplication.setDefaultProperties指定)
常用配置
应用端口配置
server.port=8090
时间格式化配置
spring:
jackson.time-zone: Asia/Shanghai
jackson.date-format: yyyy-MM-dd HH:mm:ss
时区设置
spring:
jackson.time-zone: Asia/Shanghai
注意:使用
YAML
代替Properties
写法,冒号后面加个空格
多环境配置
多环境配置的好处
1.不同环境配置可以配置不同的参数
2.便于部署,提高效率,减少出错
Properties 多环境配置
1.配置激活选项
spring.profiles.active=dev
2.添加其他配置文件
application-dev.properties
application-test.properties
application-prod.properties
application.properties
YAML多环境配置
1.配置激活选项
spring:
profiles:
active: dev
2.在配置文件添加三个英文状态下的短横线即可区分
---
spring:
profiles: dev
两种配置方式的比较
-
Properties配置多环境,需要添加多个配置文件,
YAML
只需要一个配件文件2.书写格式的差异,
yaml
相对比较简洁,优雅 -
YAML
的缺点:不能通过@PropertySource
注解加载。如果需要使用@PropertySource
注解的方式加载值,那就要使用properties文件。
如何使用
java -jar myapp.jar --spring.profiles.active=dev
配置高级篇
一、配置方式
1、Spring Boot 应用的配置内容都可以统一集中在src/main/resource/application.properties文件中进行配置。
根据我们引入的不同Starter模块,可以在这里定义容器端口号、数据库连接ixnxi、日志级别等各种配置信息。
2、支持现在被广泛推荐使用的YAML文件。
YAML(英语发音类似camel)是一个可读性高,用来表达资料序列的格式。
全称是:YAML Ain’t a Markup Language,不是一种标记语言。
YAML的意思其实是:Yet Another Markup Language(仍是一种标记语言),但为了强调这种语言以数据作为中心,而不是以标记语言为重点,而用反向缩略语重新命名。
YMAL设计参考了多种语言,包括C语言、python、perl,并从XML、电子邮件的数据格式(RFC 2822)中获得灵感。
YMAL特点:
YMAL的语法和其他高阶语言类似,并且可以简单地表达清单、散列表、标量等形态。
使用空白符号缩排和大量依赖外观的特色,特别适合来表达或编辑数据结构、各种设定文档、文件大纲。
比较适合表达阶层式的数据结构,也可以用精致的语法表示关联性(relational model)的资料。
YMAL使用空白符号和分行来分割资料,使得它特别适合用 grep/python/perl/ruby 操作。
巧妙避开各种封闭符号,如引号、各种括号等,这些符号在巢状结构时会变得复杂而难以辨认。
——维基百科
YAML 采用的配置格式不像properties的配置那样以单纯的键值对形式来表示,而是以类似大纲的缩进形式来表示。
YMAL还可以在一个单个文件中通过使用 spring.profies 属性来定义多个不同的环境变量。比如默认、指定等形式。
server:
port: 8881
—
spring:
profiles: test
server:
port: 8882
\---
spring:
profiles: prod
server:
port: 8883
注意:YMAL目前还有一些不足,它无法通过@PropertySource注解来加载配置。但是,YAML将属性加载到内存中保存的时候是有序的,所以当配置文件中的信息需要具备顺序含义的时候,YAML的配置方式比起properties配置文件更有优势。
二、如何实现多环境配置
在Spring Boot中,多环境配置的文件名需要满足application-{profile}.properties的格式,其中{profile}对应你的环境标识,比如:
application-dev.properties:开发环境
application-test.properties:测试环境
application-prod.properties:生产环境
至于具体哪个配置文件会被加载,需要在application.properties 文件中通过 spring.profiles.active 属性来设置。
可在启动时动态修改这个配置属性值:
java -jar xxx.jar --spring.profiles.active=prod
总结多环境的配置思路:
1、在application.properties 中配置通用内容,并设置 spring.profiles.active=dev,以开发环境为默认配置
2、在application-{profile}.properties 中配置各个环境布偶她能更多内容。
3、通过命令行方式去激活不同环境的配置。
三、配置信息的加载顺序
为了能够更加合理的重写各属性的值,Spring Boot 使用了下面这种较为特别的属性加载顺序:
1、在命令行中传入的参数。
2、SPRING_APPLICATION_JSON 中的属性。SPRING_APPLICATION_JSON是以JSON格式配置在系统环境变量中的内容。
3、java:com/env 中的 JNDI 属性。
4、Java的系统属性,可以通过 System.getProperties() 获得的内容。
5、操作系统的环境变量。
6、通过 random.* 配置的随机属性。
7、位于当前应用 jar包之外,针对不同{profile}环境的配置文件内容,例如application-{profile}.properties或是YMAL定义的配置文件。
8、位于当前应用jar包之内,针对不同{profile}环境的配置文件内容,例如application-{profile}.properties或是YMAL定义的配置文件。
9、位于当前应用 jar包之外的application.properties和YMAL配置内容。
10、位于当前应用 jar包之内的application.properties和YMAL配置内容。
11、在@Configuration注解修改的类中,通过@PropertySource注解定义的属性。
12、应用默认属性,使用SpringApplication.setDefaultProperties定义的内容。
优先级按上面的顺序由高到低,数字越小优先级越高。
可以看到,其中第7和第9项都是从应用jar包之外读取配置文件,所以,实现外部化配置的原理就是从此切入,为其制定外部配置文件的加载位置来取代jar包之内的配置内容。
这样,我们的工程在配置中就变得非常干净,只需要在本地放置开发需要的配置即可,而不用关系其它环境的配置,由其对应环境的负责人去维护即可。
四、自定义参数
除了可以在 Spring Boot 的配置文件中设置各个 Starter 模块中预定义的配置属性,也可以在配置文件中定义一些我们需要的自定义属性,在 application.properties中定义:
you.name=kony
you.age=18
在应用中可以通过@Value注解来加载这些自定义的参数。
@Service
public class person{
@Value("${you.name}")
private String name;
@Value("${you.age}")
private int age;
getter...
setter...
}
@Value注解加载属性值支持两种表达式来进行配置:
1、一种是PlaceHolder方式,格式为${…}。
2、另一种是使用 SpEL 表达式(Spring Expression Language),格式为 #{…}。
五、参数引用
在application.properties 中的各个参数之间可以直接通过使用 PlaceHolder 的方式来进行引用。
you.name=kony
you.age=18
person.desc=my name is ${you.name} and age ${you.age}
六、使用随机数
在一些特殊情况下,希望有些参数每次被加载的时候不是一个固定的值,比如密码、服务端口等。在Spring Boot的属性文件中,可以通过使用¥{random}配置来阐释随机的int、long、string值。而不需要在程序中通过编码来实现这些逻辑。
配置方式有以下几种:
#随机字符串
you.name=${random.value}
#随机 int
you.age=${random.int}
#随机long
you.long=${random.long}
#10以内的随机数
you.random.scope1=${random.int(10)}
#10-20的随机数
you.random.scope2=${random.int(10,20)}
该配置可以设置应用端口场景,避免端口冲突。
七、命令行参数
如何启动Spring Boot 应用?
使用命令:java -jar,该命令除了启动应用之外,还可以在命令行中指定应用的参数,比如 java -jar xxx.jar --server.port=8080,直接以命令行的方式来设置server.port属性。
连续两个减号–就是对application.properties 中的属性值进行赋值的标识,相当于在文件中添加属性server.port=8080。
you.age=${random.int}
#随机long
you.long=${random.long}
#10以内的随机数
you.random.scope1=${random.int(10)}
#10-20的随机数
you.random.scope2=${random.int(10,20)}
该配置可以设置应用端口场景,避免端口冲突。
七、命令行参数
如何启动Spring Boot 应用?
使用命令:java -jar,该命令除了启动应用之外,还可以在命令行中指定应用的参数,比如 java -jar xxx.jar --server.port=8080,直接以命令行的方式来设置server.port属性。
连续两个减号–就是对application.properties 中的属性值进行赋值的标识,相当于在文件中添加属性server.port=8080。
通过命令行来修改属性值是 Spring Boot 非常重要的一个特性。