以下笔记内容,?整理自B站黑马springBoot视频,抖音Holis
1.收集Spring开发者的编程习惯,整理开发过程使用的常用技术列表一>(技术集A)
2.收集常用技术(技术集A)的使用参数,整理开发过程中每个技术的常用设置列表一>(设置集B)
3.初始化SpringBoot基础环境,加载用户自定义的bean和导入的其他坐标,形成初始化环境
4.将技术集A包含的所有技术都定义出来,在Spring/SpringBoot启动时默认全部加载
5.将技术集A中具有使用条件的技术约定出来,设置成按条件加载,由开发者决定是否使用该技术(与初始化环境比对)
6.将设置集B作为默认配置加载(约定大于配置),减少开发者配置工作量
7.开放设置集B的配置覆盖接口,由开发者根据自身需要决定是否覆盖默认配置
// 声明Spring Boot应用的主类,springBoot从这里启动
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
// 启动Spring Boot应用, 返回IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
springBoot从这个主程序去启动,主要是@SpringBootApplication ,点进去发现这是一个复合注解,? 包含了 @EnableAutoConfiguration ,?springBoot正是通过这个@EnableAutoConfiguration来实现自动配置的。
EnableAutoConfiguration注解的源码:下面是
注意看,?这个EnableAutoConfigurationImportSelector就是自动配置的关键类了,?
该类通过 SpringFactoriesLoader.loadFactoryNames()读取了ClassPath下面的META-INF/spring.factories?(关键文件)文件。
?spring.factories?
spring.factories对应 1、自动配置原理中的技术集A ,?它里边的各种AutoConfiguration对应?技术集B ,?
用org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration举个例子,?
我们在主程序中遍历输出?ioc容器帮我们加载了什么
// 启动Spring Boot应用, 返回IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
String[] names = run.getBeanDefinitionNames();
for(String name: names){
System.out.println(name);
}
在控制台搜索发现,?根本没有含有redis的组件
此时,?我们如果在pom.xml中加入?redis?的?场景启动器
<!-- 添加redis的场景启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
再次运行主程序,会发现控制台输出的组件列表中?有了?redis,?
说明虽然spingBoot帮我们准备了?技术集合A,配置集合B,?但是需要我们自己去通过场景启动器选择加载哪些需要的配置
小结:
?简单点理解还可以这么来,?即spingBoot帮我们准备了一大堆的食材(spring.factories),?且这堆食材按菜名分类打包好了(AutoConfiguration) ,?我们就是厨师,指定要做什么菜(starter场景启动器),然后再指出自己个性化的菜单(即application.properties?或者是?yml)? ,?最后springBoot根据我们需要的菜,及个性化的指定 ,?帮我们自动配置好菜品,?这就是整个自动化配置的原理的理解。
专业化解释:
? ? ? ? ?自动配置相当于自动档,我们需要先懂得各种技术(ssm,redis,mybatisPlus)的手动档配置,?再结合自动配置帮我们配置了什么,我们还需要什么配置什么, 我们才真正能够应用好spingBoot的自动配置
??