YML配置
SpringBoot使用一个全局的配置文件,配置文件名称是固定的,支持两种文件格式:
-
application.properties
- 语法结构:key=value
-
application.yml
- 语法结构:key:空格value
配置文件的作用:修改SpringBoot自动配置的默认值,因为SpringBoot在底层都给我们自动配置好了;
比如我们可以在配置文件中修改Tomcat默认启动的端口号!测试一下!
server.port=8081
YAML概述
YAML是"YAML Ain't a Markup Language"(YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)
这种语言以数据作为中心,而不是以标记语言为重点!
以前的配置文件,大多数都是使用xml来配置;比如一个简单的端口配置,我们来对比下yaml和xml
传统xml配置:
<server>
<port>8081<port>
</server>
yaml配置:
server:
prot: 8080
YAML基础语法
说明:语法要求严格!
- 空格不能省略
- 以缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级的。
- 属性和值的大小写都是十分敏感的。
字面量:普通的值[数字,布尔值,字符串]
字面量直接写在后面就可以,字符串默认不用加上双引号或者单引号;
k: v
注意:
- “ ”双引号,不会转义字符串里面的特殊字符,特殊字符会作为本身想表示的意思;
比如:name:"kuang \n shen" 输出:kuang 换行 shen - ''单引号,会转义特殊字符,特殊字符最终会变成和普通字符一样输出
比如:name:‘kuang \n shen’ 输出:kuang \n shen
对象、Map(键值对)
#对象、Map格式
k:
v1:
v2:
在下一行来写对象的属性和值得关系,注意缩进;比如:
student:
name: qinjiang
age: 3
行内写法
student: {name: qinjiang,age: 3}
数组(List、set)
用-值表示数组中的一个元素,比如:
pets:
- cat
- dog
- pig
行内写法
pets: [cat,dog,pig]
修改SpringBoot的默认端口号
配置文件中添加,端口号的参数,就可以切换端口;
server:
port: 8082
yml配置文件
server:
port: 8080
my:
name: demo
spring:
profiles:
active: dev
---
#development environment
spring:
profiles: dev
server:
port: 8160
my:
name: ricky
---
#test environment
spring:
profiles: test
server:
port: 8180
my:
name: test
---
#production environment
spring:
profiles: prod
server:
port: 8190
my:
name: prod
application.yml文件分为四部分,使用---来做为分隔符,第一部分通用配置部分,表示三个环境都通用的属性,后面三段分别为:开发,测试,生产,用spring.profiles指定了一个值(开发为dev,测试为test,生产为prod),这个值表示该段配置应该用在哪一个profile里面。
若是本地启动,在通用配置里面能够设置调用哪一个环境的profile,也就是第一段的spring.profiles.active=XXX,其中XXX是后面3段中spring.profiles对应的value,经过这个就能够控制本地启动调用哪一个环境的配置文件,例如:服务器
spring:
profiles:
active: dev
表示默认加载的就是开发环境的配置,若是dev换成test,则会加载测试环境的属性,以此类推。
注意:若是spring.profiles.active没有指定值,那么只会使用没有指定spring.profiles文件的值,也就是只会加载通用的配置。
启动参数
Java启动jar命令:
java [ options ] -jar file.jar [ arguments ]
Java HotSpot VMs针对,当前运行时环境,提供了一套调准的options。
-Dproperty=value
Sets a system property value. If value is a string that contains spaces, then you must enclose the string in double quotation marks:
java -Dmydir="some string" SomeClass
大意是:如果值是包含空格的字符串,则必须用双引号将该字符串括起来。
以下几种方式都可以被@Value读取到
1、-D 系统属性注入
java -jar -Dserver.port=8888 -Xms1024m demo.jar
-D(defintion)表示自定义参数
这种方式增加的参数是被设置到应用的系统属性中,可以使用System.getProperty(“server.port”)获取(可以在idea的idea VM options中配置,以空格分隔)
注意:-D参数必须在jar包之前。
2、属性赋值
在用命令行方式启动springBoot应用时,连续的两个减号--就是对application.properties中的属性值进行赋值的标识。所以,java -jar xxx.jar --server.port=8888命令,等价于application.properties中添加属性server.port=8888。
java -jar demo.jar --server.port=8888
这种方式增加的参数是属于命令行参数,即会从springboot启动时的main方法的String[] args中作为参数传入(可以在idea的program arguments中配置,以空格分隔)
注意:
- –属性赋值若在-jar之前,则脚本错误,无法启动。
日志肯定不会打印,因为系统起不来。可以在最后设置转向输出: > ./server.out 2>&1 &
#无法识别的选项
Unrecognized option: --spring.profiles.active=sit
#错误:无法创建Java虚拟机。
Error: Could not create the Java Virtual Machine.
#错误:发生致命异常。程序将退出。
Error: A fatal exception has occurred. Program will exit.
- –属性赋值为linux的shell内部命令,朋友说的,暂未证实。目前测试来看,–只能放在-jar后,对相应属性赋值。
- -D为Java内部命令,必须放在-jar前,在其后则无效。
- 目前来看,既然-D和–都能实现属性注入,最好还是使用spring自带的-D。
- 最终启动命令修改如下,(为了方便展示,中间有回车,若使用记得去除)。
一般来讲,启动命令注入的参数基本为不变参数,类似于UTF-8这种格式设置。
-Dapollo这种ip配置变更可能性大,最好还是放在jar包同级目录config文件夹下。
nohup java -Xmx512m -Xms512m -Xss512k -XX:MaxDirectMemorySize=1G -XX:+UseG1GC
-XX:MaxGCPauseMillis=200 -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=40
-XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10
-XX:GCLogFileSize=100M -XX:+HeapDumpOnOutOfMemoryError -XX:+DisableExplicitGC
-XX:-OmitStackTraceInFastThrow -XX:+PrintCommandLineFlags -XX:+UnlockCommercialFeatures
-XX:+FlightRecorder -Djava.net.preferIPv4Stack=true -Dfile.encoding=UTF-8
-Dapollo.meta=http://10.7.xxx.1x2:7080 -jar ./$appName > ./server.out 2>&1 &
–属性赋值若在-jar之前,则脚本错误,无法启动。
3、从操作系统的环境变量中读取
这种方式的参数即属于操作系统方面的,比如安装jdk时设置的环境变量,定义JAVA_HOME,也可以通过System.getenv(“JAVA_HOME”)获取,(可以在idea的VM Environment variables中配置,以;分隔)
4、通过项目中配置文件bootstrap/application文件载入
这种方式是在项目中配置的方式,比较常见