spring boot配置及原理学习
1.产生背景
我们知道,在技术领域,任何一项新技术的出现都是为了解决老技术的不足或者是使用的不方便。在java开发领域,spring凭借其优秀的特性成为很多企业都会使用的框架,但是其缺点就是我们需要手动编写一堆xml配置文件来进行维护,随着项目的扩大,xml文件越来越多,越来越难维护,因此spring boot出现了。它也是spring家族的一个产品,其实它本身并不是一个新技术,只不过对spring进行了再封装,它尽可能帮我们配置好一些东西,简化我们的开发!总之一句话,就是约定大于配置,其含义就是spring boot会默认按照他的约定去做一些事情,不需要你再手动配置,如果偏离了约定,那么需要手动配置。
2.Spring Boot主要特性
https://www.jianshu.com/p/72b09eb6ee25
- 遵循“约定优于配置”的原则,简化配置
- 可以完全脱离XML配置文件,采用注解配置和java Config
- 内嵌Servlet容器,应用可用jar包执行:java -jar
- 快速完成项目搭建、整合第三方类库,方便易用
- 提供了starter POM, 能够非常方便的进行包管理, 简化包管理配置
- 与Spring cloud天然集成,spring boot是目前java体系内实现微服务最佳方案
3.快速构建一个spring boot程序
3.1官网下载
用idea倒入项目
3.2 idea创建(开发使用)
4.原理初探
4.1pom.xml
- spring-boot-dependencies是核心依赖,在其父工程中。
- spring-boot-starter是启动器,是根据场景划分的,例如要使用web的东西,直接依赖spring-boot-starter-web
- 我们要使用什么功能,只需要找到对应的启动器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
4.2主程序
@SpringBootApplication //表示是一个springboot应用
public class SpringBootStudyApplication {
public static void main(String[] args) {
//启动应用
SpringApplication.run(SpringBootStudyApplication.class, args);
}
}
5.spring boot配置
spring boot的配置文件一般有两种方式,yaml和properties,properties用法固定且需要手动设置编码格式,yaml用法灵活且代码量更少,所以一般建议使用yaml格式进行配置。
5.1yaml配置
- 冒号后面必须有一个空格,不能省略以缩进来控制层级关系
- 左边对齐的为同一层级
- 属性和值的大小写敏感
- 双引号中的特殊字符会转义输出,如"hello \n world"会发生换行
- 单引号中的特殊字符会原样输出,如‘hello \n world’所见即所得
yaml给对象赋值
@Component
@ConfigurationProperties(prefix = "user")
public class User {
int age;
String name;
List list;
Map map;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public Map getMap() {
return map;
}
public void setMap(Map map) {
this.map = map;
}
@Override
public String toString() {
return "User{" +
"age=" + age +
", name='" + name + '\'' +
", list=" + list +
", map=" + map +
'}';
}
}
user:
age: 18
name: 测试
map: {
v1: h1,v2: h2}
list:
- a
- b
- c
yaml松散绑定给对象赋值
yaml松散绑定给对象赋值指的是在yaml中可以用last-name的格式给用驼峰规则命名的属性lastName赋值
yaml和jsr303校验
- jsr303可以对对象的属性做一些校验,例如判断为null或者邮箱格式等
- 导入校验相关依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
- 常见参数
5.2多环境配置及配置文件位置
配置文件位置
yaml文件有四种存放位置,其按读取优先级排序如下:
- /config/application.yaml //项目目录(根目录)下的config文件夹下
- /application.yaml //直接在项目目录(根目录)下
- /src/main/resources/config/application.yaml
- /src/main/resources/application.yaml //默认使用
多环境配置
在实际开发中,一般会有多套环境,从而也有多份配置对应
properties方式配置
可在默认配置中使用spring.profiles.active进行环境指定
yam方式配置
yam可以在一份文件中配置多个环境
6.自动配置原理再探究
前面我们研究过,spring boot实际上会去寻找spring-boot-autoconfigure-2.3.4.RELEASE.jar包目录下META-INF/spring.factories,spring.factories里面定义了具体功能的配置类,该配置类利用@EnableConfigurationProperties和具体的属性类相关联,属性类通过@ConfigurationProperties和yaml为属性赋值,spring boot配置类属性会有默认值,如果不想使用默认值,则需要在yaml中进行显示声明,也就是说xxxAutoConfigurationpei配置类会和xxxProperties属性类关联,而xxxProperties又会和配置文件进行绑定,所以我们可以在配置文件中进行属性配置,这就是自动配置原理。同时,xxxAutoConfigurationpei配置类使用@Conditional开头的注解进行相关生效判断。
例如spring.factories下的HttpEncodingAutoConfiguration
HttpEncodingAutoConfiguration配置类
ServerProperties.class属性类
SpringBoot内置条件注解
通过配置debug可以看到哪些配置类生效
已经生效的类
未生效的类
无条件的类