一、YAML介绍

springboot会根据场景启动器完成大量的自动配置。但是有时候需要调整这些配置,这时候springboot提供了衣个核心配置文件可以修改自动配置的值。
在使用脚手架创建项目时会默认的在main/resources下添加一个application.properties文件,这个就是springboot的核心配置文件。

  • application.properties
  • application.yml /application.yaml

配置文件的作用:修改springBoot自动配置的默认值;

YAML文件:

image.png
YAML(YAML Ain’t Markup Language) :不是一个标记语言
YAML A Markup Language:是一个标记语言

标记语言:
以前的配置文件;大多都使用的是 xxxx.xml文件;
YAML:以数据为中心,比json、xml等更适合做配置文件;
YAML:配置例子

配置一个端口和访问路径:
[1]xml

  1. <server>
  2. <port>8080</port>
  3. <context-path>/app</context-path>
  4. </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>

项目打包
image.png
将jar拷贝出来直接运行
命名: java -jar SpringBoot-01-1.0-SNAPSHOT.jar —spring(配置参数)
image.png
也可以在后面加上 —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配置
image.png
image.png