与其明天开始,不如现在行动!
文章目录
- 1 依赖管理机制
- 2 自动配置机制
- 2.1 初步理解
- 2.2 完整流程
- 💎总结
1 依赖管理机制
-
为什么导入
starter-web
后所有相关依赖都会导入进来?- 开发什么场景,导入什么场景启动器
-spring-boot-starter-
- maven依赖传递原则,a-b-c:a就拥有c
- 导入一个场景启动器,就会自动把整个场景的所有核心依赖全部导入进来
- 开发什么场景,导入什么场景启动器
-
为什么版本号都不用写?
-
每个boot项目都有一个父项目:
spring-boot-starter-parent
-
parent的父项目是:
spring-boot-dependencies
-
在里面版本仲裁中心就写好了每个jar包的版本
-
要自定义版本号
- 直接在依赖下面声明版本号
- 利用maven的就近原则
- 直接在当前项目使用
<properties>
标签
- 直接在当前项目使用
<properties> <mysql.version>8.0.31</mysql.version> </properties>
-
第三方jar包要自己声明
-
2 自动配置机制
2.1 初步理解
- 自动配置的Tomcat、SpringMVC等
- 以前:要配置一堆的组件
- 现在:SpringBoot自动配置好这些组件,容器中有了什么组件,就具有什么功能
- 导入场景,容器中就会自动配置好这个场景的核心组件
- 默认的包扫描规则
- @SpringBootApplication注解的类就是主程序
- SpringBoot只会扫描主程序所在的包及其下面的子包:
com.wen.usercenter
及其子包
- 配置默认值
- 配置文件(如:application.properties)的所有配置项是和某个类的对象值进行一一绑定的
- 绑定了配置文件中每一项值的类:配置属性类
- 按需加载自动配置
- 导入场景
spring-boot-starter-web
- 场景启动器除了会导入相关依赖,还导入一个
spring-boot-starter
,是所有starter
的starter
,基础核心starter spring-boot-starter
导入了一个包spring-boot-autoconfigure
。包里面都是各种场景的AutoConfiguration
自动配置类- 虽然全场景的自动配置都在
spring-boot-autoconfigure
这个包,但是不是全部开启的。导入哪个场景就开启哪个。
- 导入场景
总结:导入场景启动器,触发spring-boot-autoconfigure
这个包的自动配置生效,容器中就会具有相关的功能
2.2 完整流程
思考:
- SpringBoot怎么实现导入一个
starter
,写一些简单的配置,应用就能跑起来,我们无需关心整合?- 为什么Tomcat的端口号可以配置在
application.properties
中,并且Tomcat能启动成功?- 导入场景后哪些自动配置能生效?
流程:
- 导入
stater
:导入了web开发场景- 场景启动器导入了相关场景的所有依赖:
starter-json
、starter-tomcat
、springmvc
- 每个场景启动器都引入了一个
spring-boot-starter
核心场景启动器 - 核心场景启动器引入了
spring-boot-autoconfigure
自动配置包,里面囊括了所有场景的所有配置 - 只要这个包下的所有类都能生效,那么相当于SpringBoot官方写好的整合功能就生效了
- SpringBoot默认扫描不到
spring-boot-autoconfigure
下写好的所有配置类
- 场景启动器导入了相关场景的所有依赖:
- 主程序:
@SpringBootApplication
@SpringBootApplication
由三个注解组成:@SpringBootConfiguration
、@EnableAutoConfiguration
、@ComponentScan
- SpringBoot默认扫描不到
spring-boot-autoconfigure
下写好的所有配置类 @EnableAutoConfiguration
:SpringBoot开启自动配置的核心。- 是由
@Import({AutoConfigurationImportSelector.class})
提供功能:批量给容器中导入组件 - SpringBoot启动会默认加载142个配置类
- 这142个配置类来自于
spring-boot-autoconfigure
包下META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
文件指定的所有类 - 项目启动的时候利用
@Import
批量导入组件机制把autoconfigure
包下的142个xxxAutoConfiguration
类导入进来(自动配置类) - 按需生效:
- 虽然导入了142个自动配置类,但是并不是都能生效
- 每个自动配置类,都有条件注解
@ConditionOnXxx
,只有条件成立,才能生效
xxxAutoConfiguration
自动配置类- 给容器中使用@Bean放一堆组件
- 每个自动配置类都有可能由注解:
@EnableConfigurationProperties(ServerProperties.class)
,用来把配置文件中配的指定前缀的属性值封装到xxxProperties
属性类中 - 以Tomcat为例,把服务器的所有配置都是以
server
开头的。配置都封装到属性类中 - 给容器中放的所有组件的一些核心参数,都来自于
xxxProperties
。xxxProperties
都适合配置文件绑定的 - 只需要改配置文件的值,核心组件的底层参数都能修改
- 是由
- 写业务,无需关心各种整合(底层这些整合都写好了,而且也生效了)
核心流程:
- 导入
starter
,就会导入autoconfigure
包 autoconfigure
包里面有一个文件META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
,里面指定了所有启动要加载的自动配置类@EnableAutoConfiguration
会自动的把上面文件里面写的所有自动配置类都导入进来。xxxAutoConfiguration
给容器中导入很多组件,根据条件注解按需加载 ,组件都是从xxxProperties
中提取属性值xxxProperties
又是和配置文件进行绑定
效果:导入starter
、修i该配置文件、就能修改底层行为
💎总结
本文中若是有出现的错误请在评论区或者私信指出,我再进行改正优化,如果文章对你有所帮助,请给博主一个宝贵的三连,感谢大家😘!!!