原理初探
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() 做了下面四件事:
- 推断应用类型是普通的项目还是 web 项目
- 查找并加载所有可用初始化器,设置到 initializers 属性中
- 找出所有的应用程序监听器,设置到 listeners 属性中
- 推断并设置 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”) 作用:
- 将配置文件中配置的每一个属性的值,映射到这个组件中
- 告诉 Spring Boot 将本类中的所有属性和配置文件中相关配置进行绑定
- 参数 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=“自定义的报错”)
报错:
小结
结论:
- yaml 配置和 properties 配置都能获取到值,推荐 yaml
- 如果在某个业务中,只需要配置文件中的某个值,可以使用 @Value
- 如果专门编写了一个 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