[toc]
Lecture02-SpringBoot-使用-基础
一、工程结构
1、pom.xml
①位置

②内容
[1]继承SpringBoot提供的父工程
具体 SpringBoot 使用哪一个版本,就是在这里决定的
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.12</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
[2]依赖
使用SpringBoot需要导入各个场景对应的starter(场景启动器)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
2、主启动类
①所在位置

②内部

3、resources目录


二、包扫描范围
1、默认扫描范围
- 主启动类所在包
- 主启动类所在包的子包
2、定制
①用法
使用@ComponentScan注解,标记在主启动类上:
@SpringBootApplication
@ComponentScan("com.atguigu.demo.controller")
public class Module33DemoMainType {
public static void main(String[] args) {
SpringApplication.run(Module33DemoMainType.class, args);
}
}
②注意
一旦使用@ComponentScan注解指定了其它扫描的包,那么默认规则就无效了
3、延伸
module_A依赖了module_B,那么A中可以扫描B中的组件,只要B中的组件所在包在扫描范围内即可
原因是A依赖B之后,module_B会以jar包的形式引入module_A
三、依赖管理与版本仲裁
1、提出问题
为什么使用spring-boot-starter-web时不需要写version:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2、探究
通过 IDEA 显示的这个图标,我们得知:这是一个被父工程管理的依赖:

点击上面图标按钮,进入到spring-boot-dependencies的pom文件
3、继承关系

4、依赖管理
spring-boot-dependencies的POM文件中管理依赖
①声明了很多依赖版本


②dependencyManagement中版本号引用

③子工程应用
父工程中管理依赖的声明:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>3.3.12</version>
</dependency>
子工程中的引用:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
小贴士:以后我们在使用各种starter时,可以关注一下它是否是Spring官方开发的
像spring-boot-starter-web这种以SpringBoot名称开头的,都是SpringBoot官方的starter,通常可以省略版本号;
像mybatis-spring-boot-starter这种第三方技术名称开头的,都不是SpringBoot官方的starter,通常需要写明版本号
5、版本仲裁
①SpringBoot出世之前的痛点举例
SpringMVC和Jackson二者之间存在版本匹配的问题:
(Jackson是SpringMVC内部默认进行 JSON 数据处理的 jar 包)
| Spring Boot 版本 | Spring Framework | Jackson Databind | Java 支持 |
|---|---|---|---|
| 3.1.x | 6.0.x | 2.15.x | 17+ |
| 3.0.x | 6.0.x | 2.14.x | 17+ |
| 2.7.x (LTS) | 5.3.x | 2.13.x | 8-17 |
| 2.6.x | 5.3.x | 2.13.x | 8-17 |
SpringMVC尽管用到了Jackson技术,但是并没有依赖Jackson,这就给开发人员带来一个问题:我们必须自己知道当前SpringMVC版本需要的Jackson什么版本匹配
如果不慎使用了不匹配的版本,程序运行时也没有明确的报错提示,只是返回类似406等等这样的响应状态码,让排查问题非常困难
②SpringBoot解决方案
基于场景启动器,当前场景所需的所有依赖都被导入,而且所有涉及到的依赖版本都经过了严格测试——版本仲裁,不会有版本不匹配、jar包冲突问题:

四、场景启动器
1、概念
在使用 SpringBoot 时引入的各种 xxx-starter 依赖
- SpringBoot官方:spring-boot-starter-web
- SpringBoot官方:spring-boot-starter-json
- SpringBoot官方:spring-boot-starter-test
- SpringBoot官方:spring-boot-starter-jdbc
- SpringBoot官方:spring-boot-starter-tomcat
- 第三方:mybatis-spring-boot-starter
- 第三方:knife4j-openapi3-jakarta-spring-boot-starter
- 第三方:pagehelper-spring-boot-starter
- ……
也有人把“场景启动器”叫做“起步依赖”
2、意义
- 把特定场景下所需依赖全部导入
- starter内部包含了很多自动配置相关组件、配置文件,starter本身也是自动化配置机制的一部分
- starter相当于对所有一个一个具体的依赖,以场景为单位进行了封装和整合,依赖以场景为单位实现了组件化。组件化之后,不仅开发人员可以直接使用,还可以给其它starter使用

相当于,在依赖管理这件事上:
- Maven提供的是基础功能
- starter在Maven基础功能的基础上,又进行了组件化的封装