前言:

本文内容:了解主启动类怎么运行、yaml语法讲解、给属性赋值的几种方式

推荐免费SpringBoot基础教程视频:【狂神说Java】SpringBoot最新教程通俗易懂_哔哩哔哩_bilibili

了解主启动类怎么运行

Run

本以为就是运行了一个main方法,没想到却是开启了一个服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.jokerdig;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

// @SpringBootApplication 标注这个类是一个SpringBoot的应用
@SpringBootApplication
public class Springboot01HelloworldApplication {

public static void main(String[] args) {
// 该方法返回一个ConfigurableApplicationContext对象
// 参数一:应用入口类 参数类:命令行参数
SpringApplication.run(Springboot01HelloworldApplication.class, args);
}
}

SpringApplication.run分析

  1. SpringApplication的实例化
  2. run方法的执行

SpringApplication

主要做以下四件事:

  1. 推断应用的类型是普通的项目还是Web项目
  2. 查找并加载所有可用初始化器,设置到iniltializers属性中
  3. 找出所有的应用程序监听器,设置到listeners属性中
  4. 推断并设置main方法的定义类,找到运行的主类

查看构造器

1
2
3
4
5
6
7
this.resourceLoader = resourceLoader;
Assert.notNull(primarySources, "PrimarySources must not be null");
this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
this.webApplicationType = WebApplicationType.deduceFromClasspath();
setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
this.mainApplicationClass = deduceMainApplicationClass();

run方法

63

yaml语法讲解

配置文件

SpringBoot使用一个全局的配置文件,配置文件名是固定的

  • application.properties

    语法结构:key=value

  • application.yml

    语法结构:key: value(中间有空格哦)

配置文件作用:修改SpringBoot自动配置的默认值,因为SpringBoot在底层都为我们自动配置好了。

YAML

YAML 是 “YAML Ain’t a Markup Language”(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言)。

配置的区别:

yaml配置

1
2
server:
port: 8080

xml配置

1
2
3
<server>
<port>8080</port>
</server>

YAML语法

基本语法

1
key: value

以此来表示一堆键值对(空格不能省略);以空格的缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级的

注意:属性和值的大小写都是十分敏感的

1
2
3
server:
port: 8080
path: /hello

值的写法

自变量: 普通的值[数字,布尔值,字符串]

1
key: value

自变量直接写在后面,字符串默认不用加双引号或者单引号;且双引号不会转义字符串里的特殊字符。

1
2
3
4
5
# 例如:
name: "jokerdig \n com"
# 输出为:直接实现换行效果
jokerdig
com

项目搭建

  1. 新建一个项目springboot-02-config

    如果你使用的是旧版IDEA,且Maven使用了国内镜像,那么在spring-boot-starter-parent版本爆红的时候修改版本为2.3.0.RELEASE即可。

  2. 找到application.properties

    1
    2
    3
    4
    5
    # springboot的这个配置文件中可以配置哪些内容呢

    # 1. 可以使用官方配置
    # 地址:https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#appendix
    # 官方全部配置过于繁琐
  3. 第二种方法,删除application.properties新建一个application.yaml

    练习基本语法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # key: value
    name: Jokerdig
    # 存储对象
    student:
    name: Jokerdig
    age: 21
    # 行内写法
    student1: {name: Jokerdig,age: 21}
    # 数组
    pets:
    - cat
    - dog
    - pig
    # 行内写法
    pets1: [cat,dog,pig]

给属性赋值的几种方式

yaml可以直接给实体类赋值

  1. 新建pojo包,在包下新建实体类Person.javaDog.java

    这里我们引入lombok

    Person.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    package com.jokerdig.pojo;

    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import org.springframework.stereotype.Component;

    import java.util.Date;
    import java.util.List;
    import java.util.Map;

    /**
    * @author Joker大雄
    * @data 2022/7/13 - 11:29
    **/
    @Component
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Person {
    private String name;
    private Integer age;
    private boolean happy;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;
    }

    Dog.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    package com.jokerdig.pojo;

    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import org.springframework.stereotype.Component;

    /**
    * @author Joker大雄
    * @data 2022/7/13 - 11:26
    **/
    @Component
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Dog {
    private String name;
    private Integer age;
    }
  2. 通过yaml对实体类进行赋值

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
       person:
    name: JokerDaxiong
    age: 21
    happy: true
    birth: 2000/1/1
    maps: {key1,key2,key3}
    lists:
    - Java
    - JavaScript
    - SpringBoot
    dog:
    name: 呆呆
    age: 5

    3. 通过注解绑定到实体类

    > 当我们配置`@ConfigurationProperties`注解的时候IDEA上方会有爆红提示,点击Open Documentation进行配置即可(注意:这个爆红并不影响程序运行)
    >
    > 在pom.xml添加该依赖即可
    >
    > ```xml
    > <!-- @ConfigurationProperties 爆红解决-->
    > <dependency>
    > <groupId>org.springframework.boot</groupId>
    > <artifactId>spring-boot-configuration-processor</artifactId>
    > <optional>true</optional>
    > </dependency>

    Perosn.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    package com.jokerdig.pojo;

    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.stereotype.Component;

    import java.util.Date;
    import java.util.List;
    import java.util.Map;

    /**
    * @author Joker大雄
    * @data 2022/7/13 - 11:29
    **/
    @Component
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @ConfigurationProperties(prefix = "person")
    public class Person {
    private String name;
    private Integer age;
    private boolean happy;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;
    }

    Dog.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    package com.jokerdig.pojo;

    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.stereotype.Component;

    /**
    * @author Joker大雄
    * @data 2022/7/13 - 11:26
    **/
    @Component
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @ConfigurationProperties(prefix = "dog")
    public class Dog {
    private String name;
    private Integer age;
    }
  3. 在测试类进行测试

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    package com.jokerdig;

    import com.jokerdig.pojo.Person;
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;

    @SpringBootTest
    class Springboot02ConfigApplicationTests {

    @Autowired
    private Person person;

    @Test
    void contextLoads() {
    System.out.println(person);
    }
    }
  4. 输出结果

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Person(
    name=JokerDaxiong,
    age=21, happy=true,
    birth=Sat Jan 01 00:00:00 CST 2000,
    maps={key3=, key1=, key2=},
    lists=[Java, JavaScript, SpringBoot],
    dog=Dog(
    name=呆呆,
    age=5
    )
    )
  5. 使用propertiesyaml为赋值的区别

    @ConfigurationProperties (yaml) @Value (properties)
    功能 批量注入配置文件中的属性 单个指定
    松散绑定(语法) 支持 不支持
    SpEL 不支持 支持
    JSR303数据校验 支持 不支持
    复杂类型封装 支持 不支持

SpringBoot官方推荐我们使用yaml,如果你需要使用properties来写,首先一定要确定properties的编码为UTF-8