运行原理初探:
1、pom.xml
pom.xml中依赖一个父项目(这个父项目中包含资源过滤和插件):
org.springframework.boot
spring-boot-starter-parent
2.4.5
点进去,里面还有一个父项目:
org.springframework.boot
spring-boot-dependencies
2.4.5
再点进去,里面管理了大量的jar包版本:
我们在写入或者引入一些Springboot依赖的时候,不需要指定版本,就是因为有这些版本仓库。
2、启动器(spring-boot-starter)
spring-boot-starter-xxx:就是springboot的启动器
比如 spring-boot-starter-web,它就会帮我们自动导入web环境所有的依赖
springboot会将所有的功能场景,都变成一个个的启动器。我们要使用什么功能,只需要找到对应的启动器就可以了
3、主程序
//标注这个类是一个Springboot的应用
@SpringBootApplication
public class Springboot01HelloworldApplication {
public static void main(String[] args) {
//将Springboot应用启动
SpringApplication.run(Springboot01HelloworldApplication.class, args);
}
}
我画的思维导图:ProcessOn Mindmap
结论:springboot所有的自动配置都是在启动的时候扫描并加载。扫描的是spring.factories,所有的自动配置类都在这里面,但是不一定生效,要判断条件是否成立。条件是否成立 —> 只要导入了对应的starter,就有了对应的启动器,有了启动器,我们自动装配就会生效,然后就配置成功了。
步骤:
1、 springboot在启动的时候,从 /META/spring.factories获取指定的值
2、将这些自动配置的类导入容器,自动配置就会生效,帮我们进行自动配置
3、以前我们需要自动配置的东西,现在springboot帮我们做了
4、整个javaee,解决方案和自动配置的东西都在spring-boot-autoconfigure:2.4.5这个包下
5、它会把所有需要导入的组件,以类名的方式返回,这些组件就会被添加到容器
6、容器中也会存在非常多的xxxAutoConfiguration的文件,就是这类给容器中导入了这个场景需要的所有组件,并自动配置 @Configuration
7、有了自动配置类,免去了我们手动编写配置文件的工作
主启动类怎么运行(了解)
1、SpringApplication
这个类主要做了一下4件事:
①推断应用的类型是普通项目还是Web项目
②查找并加载所有的可用初始化器,设置到initializers属性中
③找出所有的应用程序监听器,设置到listeners属性中
④推断并设置main方法的定义类,找到运行的主类
2、run()方法
谈谈你对SpringBoot的理解:1、自动装配 2、run()
springboot是通过main方法下的SpringApplication.run方法启动的,启动的时候他会调用refreshContext方法,先刷新容器,然后根据解析注解或者解析配置文件的形式注册bean,而它是通过启动类的SpringBootApplication注解进行开始解析的,他会根据EnableAutoConfiguration开启自动化配置,里面有个核心方法ImportSelect选择性的导入,根据loadFanctoryNames根据classpash路径以MATA-INF/spring.factorces下面以什么什么EnableAutoConfiguration开头的key去加载里面所有对应的自动化配置,他并不是把这一百二十多个自动化配置全部导入,在他每个自动化配置里面都有条件判断注解,先判断是否引入相互的jar包,再判断容器是否有bean再进行注入到bean容器
配置文件
SpringBoot使用一个全局的配置文件,配置文件的名字是固定的
1、application.properties
格式:key=value
2、application.yaml(或者application.yml)
格式:key: value
注意:冒号后面一定要有一个空格
配置文件的作用:
修改springboot自动配置的默认值,因为springboot在底层都给我们自动配置好了
yaml基础语法
#对象
student:
name: qiu
age: 3
#数组:
pets:
- dog
- cat
- pig
也可以换成行内写法:
#对象
student: {name: qiu, age: 3}
#数组:
pets: [dog,cat,pig]
给属性赋值的2种方式
步骤:
1、编写一个Dog类
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
public class Dog {
private String name;
private Integer age;
}
2、再编写一个Person类
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
public class Person {
private String name;
private Integer age;
private Boolean happy;
private Date birthday;
private Map maps;
private List
3、给属性赋值
①用我们原来的方式给Dog类的属性赋值:@Value
测试一下:
输出结果:
②用yaml给Person类的属性赋值 :@ConfigurationProperties
测试一下:
Person(name=丘桔, age=22, happy=true, birthday=Tue Dec 12 00:00:00 CST 2000, maps={k1=v1, k2=v2}, hobbies=[eat, sleep, money], dog=Dog(name=旺财, age=3))
补充:
如果Person类中有个爆红:
解决方式:配置依赖
org.springframework.boot
spring-boot-configuration-processor
2.5.4
对比一下这2种给属性赋值的方式:
@Value | @ConfigurationProperties | |
功能 | 一个个指定 | 批量注入配置文件中的属性 |
松散绑定(松散语法) | 不支持 | 支持 |
SpEL | 支持 | 不支持 |
JSR303数据校验 | 不支持 | 支持 |
复杂类型封装 | 不支持 | 支持 |
松散绑定:比如dog-name和dogName等价
JSR303数据校验:在字段上,增加一层过滤器验证,来保证数据合法
复杂类型封装:yaml中可以封装对象,但是@Value不可以
JSR303校验
步骤:
1、导入依赖
org.springframework.boot
spring-boot-starter-validation
2.4.5
2、使用注解
常用校验:
@NotNull(message="名字不能为空")
private String userName;
@Max(value=120,message="年龄最大不能查过120")
private int age;
@Email(message="邮箱格式错误")
private String email;
空检查
@Null 验证对象是否为null
@NotNull 验证对象是否不为null, 无法查检长度为0的字符串
@NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
@NotEmpty 检查约束元素是否为NULL或者是EMPTY.
Booelan检查
@AssertTrue 验证 Boolean 对象是否为 true
@AssertFalse 验证 Boolean 对象是否为 false
长度检查
@Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
@Length(min=, max=) string is between min and max included.
日期检查
@Past 验证 Date 和 Calendar 对象是否在当前时间之前
@Future 验证 Date 和 Calendar 对象是否在当前时间之后
@Pattern 验证 String 对象是否符合正则表达式的规则
.......等等
除此以外,我们还可以自定义一些数据校验规则
多环境配置及配置文件位置
多配置环境:
我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml , 用来指定多个环境版本;
比如:
application-dev.properties 代表开发环境配置
application-test.properties 代表测试环境配置
但是Springboot并不会直接启动这些配置文件,它默认使用application.properties主配置文件;
我们需要通过一个配置来选择需要激活的环境:
spring.profiles.active=test
配置文件加载位置优先级:
1、file: ./config/
2、file: ./
3、classpath: /config/
4、classpath: /
自动配置原理再理解
以HttpEncodingAutoConfiguration为例:
1、Springboot启动的时候会加载 /META-INF/spring.factories下面的大量的自动配置类(xxxAutoConfiguration)
2、每个自动配置类按照条件进行生效,默认绑定配置文件
有一个@EnableConfigurationProperties(ServerProperties.class)注解
ServerProperties.class点进去,里面绑定了配置文件
3、我们可以通过debug=true来查看哪些自动配置类生效了,哪些没有生效。
生效的就不需要再手动配置了;没有生效的可以导入对应的starter让它生效。
4、我们还可以通过application配置文件,指定这些属性的值