一、YAML介绍
springboot会根据场景启动器完成大量的自动配置。但是有时候需要调整这些配置,这时候springboot提供了衣个核心配置文件可以修改自动配置的值。
在使用脚手架创建项目时会默认的在main/resources下添加一个application.properties文件,这个就是springboot的核心配置文件。
- application.properties
- application.yml /application.yaml
配置文件的作用:修改springBoot自动配置的默认值;
YAML文件:
YAML(YAML Ain’t Markup Language) :不是一个标记语言
YAML A Markup Language:是一个标记语言
标记语言:
以前的配置文件;大多都使用的是 xxxx.xml文件;
YAML:以数据为中心,比json、xml等更适合做配置文件;
YAML:配置例子
配置一个端口和访问路径:
[1]xml
<server>
<port>8080</port>
<context-path>/app</context-path>
</server>
[2]properties
server.port=8989
server.servlet.context-path=/app
[3]yaml
server:
port: 8787
servlet:
context-path: /app
语法
基本语法:
K:(空格)值 —>空格必须有
以空格的缩进来进行层级控制;左边对齐的一列就是同一个层级(缩进不要求多少,而是左对齐)
# 配置用户名
username: kakaxi
nickname: "旗木 卡卡西" #字符串之间有空格要使用引号
age: 18
#配置一个账户
account:
accountName: 小樱
accountNo: 85298439429
accountInfo:
idcard: 429429192409349832
username: 樱桃小丸子
属性和值大小写敏感,如果值中间有空格就需要用双引号,否则不需要
值的写法
【1】字面量: 简单类型(数字,字符串,布尔)
字符串默认不需要加单引号或者双引号;但是字符串中间有空格就需要使用引号。
“”:双引号,将特殊字符进行转义,比如:”\n”会作为换行输出
name: “小樱 \n 樱桃小丸子” 输出:小樱 (换行) 百变小樱
‘’:单引号,不会转义特殊字符,特殊字符作为普通字符串输出
name: “小樱 \n 樱桃小丸子” 输出:小樱 \n 百变小樱
【2】对象和Map
K:V:在下一行来写对象的属性和值的关系;注意缩进
对象也是K:V的方式
#对象配置#
user:
username: 小王
userage: 23
dog:
dogName: 小白
dogColor: 白色
# map的配置
topic:
tid: 9527
title: 关于java的二三事
created: 2020-12-15 13:23:25
#行内写法#
book: {isbn: 852942428423,title: "Head First to Java"}
【3】数组(List,Set)
用- 值标书数组中的一个元素
#数组、list、set是一样的 #
usernames:
- 卡卡西
- 佐助
- 鸣人
- 小樱
users:
- user1:
name: 小丸子
age: 10
- user2:
name: 小新
age: 12
# 行内写法
names: ["路飞","索隆","乔巴"]
us: [user1: {name: 刘亦菲,age: 28},user2: {name: 王一博,age:23}]
二、配置文件值的注入
@Value的用法
@value注解完成属性值的注入就好像
<bean id = "xxx" class = "xxx.xx.xx">
<property name = "uname" value = "小樱" />
</bean>
在配置文件中添加配置
uname: 樱桃小丸子 //yml文件中
在工程中添加一个bean:使用@Value注入属性值
@Component
public class User {
@Value("${uname}")
private String username;
@Override
public String toString() {
return "username="+username;
}
}
springBoot的批量属性注入方式
配置文件
person: name: 卡卡西 age: 18
添加一个Bean
/**
* @author:Cherry
* @createTime:2021-03-30
*/
@Component
public class Person {
@Value("${person.name}")
private String name;
@Value("${person.age}")
private Integer age;
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
//getter、setter省略
}
添加依赖
<!-- 测试场景启动器 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency>
测试类
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootAppTest {
@Autowired
Person person;
@Test
public void testYaml(){
System.out.println(person);
}
}
使用@ConfigurationProperties完成属性注入
将所有的@Value注释/删除,在Person类上方添加注解:
@Component
@ConfigurationProperties("person")
public class Person {
// @Value("${person.name}")
private String name;
// @Value("${person.age}")
private Integer age;
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
@Value获取值和@ConfigurationProperties获取值比较
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定(松散语法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
配置文件yml和properties他们都能获取到值;
如果说,只在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;
如果说,我们专门编写了一个javaBean来和配置文件进行映射,使用@ConfigurationProperties;
配置文件注入值数据校验
添加@email需要的jar文件
org.hibernate hibernate-validator 5.2.4.Final
@Component
@ConfigurationProperties("person")
@Validated //开启数据校验
public class Person {
private String name;
private Integer age;
@Email
private String eamil;
//...
}
三、springBoot项目打包和部署
在springboot中自带了Tomcat插件,所以不需要打包成war包。
只需要在pom文件中添加一个插件:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
项目打包
将jar拷贝出来直接运行
命名: java -jar SpringBoot-01-1.0-SNAPSHOT.jar —spring(配置参数)
也可以在后面加上 —spring.profiles.active=prod激活生产环境
四、配置文件加载位置
springboot启动会扫描以下位置的application.properties或application.yml文件作为springboot默认配置文件
-file:./config/ -file:./ -classpath:/config/ -classpath:/
优先级由高到低,高的会覆盖低的配置
可以通过改变spring.config.location来改变默认配置文件位置
五、外部配置加顺序
springboot也可以从以下位置加载配置,优先级从高到低,高的覆盖低的,所有的配置会形成互补配置。
1.命令行参数
参数可以在命令行上进行指定
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar —server.port=8087 —server.context-path=/abc 多个配置用空格分开; —配置项=值
2.来自java:comp/env 的JNDI属性
3.java系统属性(System.getProperties())
4.操作系统环境变量
5.RandomValuePropertySource配置的random.*属性值
由jar包外向jar包内部进行寻找
优先加载带profile
6.jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
7.jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
springBoot要使用spring的配置文件
项目中加入spring配置