Lecture02-SpringBoot-使用-基础

文章目录

    [toc]

    Lecture02-SpringBoot-使用-基础

    一、工程结构

    1、pom.xml

    ①位置

    image-20250607092149456


    ②内容

    [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、主启动类

    ①所在位置

    image-20250607092526081


    ②内部

    image-20250607092822918


    3、resources目录

    image-20250607093020174

    image-20250607093117008


    二、包扫描范围

    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 显示的这个图标,我们得知:这是一个被父工程管理的依赖:

    image-20250607094454229

    点击上面图标按钮,进入到spring-boot-dependencies的pom文件


    3、继承关系

    image-20250607094838321


    4、依赖管理

    spring-boot-dependencies的POM文件中管理依赖

    ①声明了很多依赖版本

    image-20250607095310519

    image-20250607095337488


    ②dependencyManagement中版本号引用

    image-20250607095426389


    ③子工程应用

    父工程中管理依赖的声明:

          <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 FrameworkJackson DatabindJava 支持
    3.1.x6.0.x2.15.x17+
    3.0.x6.0.x2.14.x17+
    2.7.x (LTS)5.3.x2.13.x8-17
    2.6.x5.3.x2.13.x8-17

    SpringMVC尽管用到了Jackson技术,但是并没有依赖Jackson,这就给开发人员带来一个问题:我们必须自己知道当前SpringMVC版本需要的Jackson什么版本匹配

    如果不慎使用了不匹配的版本,程序运行时也没有明确的报错提示,只是返回类似406等等这样的响应状态码,让排查问题非常困难


    ②SpringBoot解决方案

    基于场景启动器,当前场景所需的所有依赖都被导入,而且所有涉及到的依赖版本都经过了严格测试——版本仲裁,不会有版本不匹配、jar包冲突问题:

    image-20250607102525990


    四、场景启动器

    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使用

    image-20250607103721860

    相当于,在依赖管理这件事上:

    • Maven提供的是基础功能
    • starter在Maven基础功能的基础上,又进行了组件化的封装
    end