Spring Boot 学习笔记

原理初探

Spring Boot 自动装配

pom.xml:

  • 核心依赖:spring-boot-dependencies 在父工程中
  • 我们在写或者引入一些 Spring Boot 依赖的时候,不需要指定的版本,就因为有这些版本仓库

启动器:

  • 是 Spring Boot 的启动场景
  • 比如 spring-boot-starter-web,它就会帮我们导入 web 环境所有的依赖
  • Spring Boot 会将所有功能的场景,都变成一个个启动器
  • 我们要使用什么功能,只需要找到对应的启动器就可以了(starter)

主程序:

// 标注这个类是一个 Spring Boot 的应用,启动类下的所有资源被导入
@SpringBootApplication
public class Springboot01HellowordApplication {
   public static void main(String[] args) {
       // 将 Spring Boot 应用启动
       SpringApplication.run(Springboot01HellowordApplication.class, args);
   }
}
  • 注解
    • @SpringBootConfiguration:Spring Boot 的配置
      • @Configuration:Spring 配置类
        • @Component:说明这也是一个 Spring 的组件
    • @EnableAutoConfiguration:自动配置
      • @AutoConfigurationPackage:自动配置包
        • @Import({Registrar.class}):自动配置“包注册”
      • @Import({AutoConfigurationImportSelector.class}):自动导入

在这里插入图片描述

了解主启动类怎么运行

SpringApplication.run() 做了下面四件事:

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

Spring Boot 配置(yaml 语法)

yaml、properties 比较

yaml(对空格的要求极其严格)

# 强大之处:可以注入到配置类中

# 普通的 key-value
name: Jarvis

# 对象
student:
  name: Jarvis
  age: 3

# 对象(行内写法)
teacher: {name: Jarvis,age: 3}

# 数组
pets:
  - cat
  - dog
  - pig

animals: [cat,dog,pig]

properties


# properties 只能保存键值对

name=Jarvis

student.name=Jarvis
student.age=3

yaml 可以直接给实体类赋值

在这里插入图片描述

就是👇这个依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

Person 实体类

⚠ 不能没有 set

@Component// 注册 bean
@ConfigurationProperties(prefix = "person")
public class Person {
    private String name;
    private Integer age;
    private boolean isHappy;
    private Date birthday;
    private Map<String, Object> map;
    private List<Object> list;
    private Dog dog;

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public void setHappy(boolean happy) {
        isHappy = happy;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public void setMap(Map<String, Object> map) {
        this.map = map;
    }

    public void setList(List<Object> list) {
        this.list = list;
    }

    public void setDog(Dog dog) {
        this.dog = dog;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", isHappy=" + isHappy +
                ", birthday=" + birthday +
                ", map=" + map +
                ", list=" + list +
                ", dog=" + dog +
                '}';
    }
}

yaml 配置

person:
  name: Jarvis
  age: 3
  isHappy: false
  birthday: 2021/5/13
  map: {k1: v1,k2: v2}
  list:
    - code
    - music
  dog:
    name: 旺财
    age: 3

测试

@SpringBootTest
class Springboot02ConfigApplicationTests {

    @Autowired
    private Person person;

    @Test
    void contextLoads() {
        System.out.println(person);
    }

}

在这里插入图片描述

@ConfigurationProperties(prefix = “person”) 作用:

  1. 将配置文件中配置的每一个属性的值,映射到这个组件中
  2. 告诉 Spring Boot 将本类中的所有属性和配置文件中相关配置进行绑定
  3. 参数 prefix = “person”:将配置文件中的 person 下所有属性一一对应

yaml 可以和 javaConfig 配合使用

person:
  name: ${random.uuid}
  age: ${random.int}
  isHappy: false
  birthday: 2021/5/13
  map: {k1: v1,k2: v2}
  list:
    - code
    - music
  dog:
    # 如果存在 person.hello 就取它,不存在就是 hello
    name: ${person.hello:hello}_旺财
    age: 3

在这里插入图片描述
在这里插入图片描述

松散绑定

实体类 Dog

@Component
@ConfigurationProperties(prefix = "dog")
public class Dog {
    private String firstName;
    private Integer age;

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "firstName='" + firstName + '\'' +
                ", age=" + age +
                '}';
    }
}

yaml 配置

dog:
  first-name: 阿黄
  age: 3

测试

@SpringBootTest
class Springboot02ConfigApplicationTests {

    @Autowired
    private Dog dog;

    @Test
    void contextLoads() {
        System.out.println(dog);
    }

}

在这里插入图片描述

JSR 303 校验
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

在这里插入图片描述

@Email(message=“自定义的报错”)

报错:
在这里插入图片描述

小结

结论:

  1. yaml 配置和 properties 配置都能获取到值,推荐 yaml
  2. 如果在某个业务中,只需要配置文件中的某个值,可以使用 @Value
  3. 如果专门编写了一个 JavaBean 来配置文件进行映射,直接 @ConfigurationProperties
多环境配置及配置文件位置

不同位置下 application.yaml 的优先级
在这里插入图片描述

  • 方法一:
    在这里插入图片描述
  • 方法二:
# spring boot 的多环境配置,可以选择激活哪一个配置文件
server:
  port: 8081
spring:
  profiles:
    active: dev

---
server:
  port: 8082
spring:
  profiles: dev

---
server:
  port: 8083
spring:
  profiles: test

未完…

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值