🤖🤖-摘要:
本文介绍了SpringBoot的快速开发流程、遇到问题的解决办法、特点和应用分析,主要包括依赖管理机制、自动装配机制,以及自动配置流程细节梳理。同时,详细解析了SpringBoot中各种配置和注解的使用。

我的SpringBoot项目第一个模块

快速开发

按照官网一步一步操作即可:
https://docs.spring.io/spring-boot/docs/current/reference/html/getting-started.html#getting-started.first-application

可能遇到的问题

pom.xml中出现Provides transitive vulnerable dependency maven:org.yaml:snakeyaml:1.33警告

  • 告警原因:Maven项目中使用了一个被认为是有漏洞的依赖项,并且这个依赖项也被其他依赖项所传递
    • org.yaml:snakeyaml:1.33这个库是存在漏洞
  • 解决警告:升级依赖项
    • 在中央仓库搜索无告警版本: https://mvnrepository.com/
    • 在Maven项目中,可以使用dependencyManagement标签来管理依赖项
    • 这个标签中,可以指定一个特定版本,以便所有依赖项都将使用这个版本
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>2.0</version>
</dependency>
</dependencies>
</dependencyManagement>
  • 解决警告:移除依赖项
    • 如果这个库不是必须的,可以考虑从项目中移除它; 或者idea中设置忽略(眼不见心不烦)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
</exclusion>
</exclusions>
</dependency>

项目启动报错:An incompatible version [1.1.29] of the Apache Tomcat Native library is installed, while Tomcat requires version [1.2.34]

模块小结

SpringBoot 是什么

SpringBoot 帮我们简单、快速地创建一个独立的、生产级别的 Spring 应用(说明:SpringBoot底层是Spring)

大多数 SpringBoot 应用只需要编写少量配置即可快速整合 Spring 平台以及第三方技术

特点

  1. 简化整合
  2. 简化开发
    • 无需编写任何配置,直接开发业务
  3. 简化配置
  4. 简化部署
    • 打包为可执行的jar包。
    • linux服务器上有java环境。
  5. 简化运维
    • 修改配置(外部放一个application.properties文件)、监控、健康检查。

应用分析

依赖管理机制

  1. 为什么导入场景启动器所有的依赖就都导入进来了?

    • 根据maven的依赖传递原则, A依赖B,B依赖C;则A同时依赖B C
    • web场景启动器为例,引入spring-boot-starter-web
    • spring-boot-starter-web 会有很多依赖,包括其他场景启动器
      spring-boot-starter-tomcat,spring-web,spring-webmvc
    • 小结一下: 该场景启动器会将所有的依赖提前准备好,根据maven的依赖传递原则就可全部引入
  2. 为什么版本号不用写?

    • 每个boot项目都有一个父项目spring-boot-starter-parent
    • parent的父项目是spring-boot-dependencies
    • 也称版本仲裁中心,使用dependencyManagement标签已将所有常见的依赖版本号提前声明好
  3. 自定义版本号

    • 根据maven的就近原则
    • 直接在当前项目properties标签中修改版本号
    • 或者直接在导入依赖的时候声明版本
  4. 第三方的jar包

    • boot 父项目没有管理的需要自行声明好
SpringBoot依赖管理

自动装配机制

自动配置

不用 SpringBoot 时, 要整合 SpringMVC 就需要自己手动配置:

  • DispatcherServlet: 拦截请求的组件
  • ViewResolver: 视图解析组件
  • CharacterEncodingFilter: 处理字符编码的组件

现在有了 SpringBoot 以上组件都不用再自己手动配置了, 直接引入web场景启动器即可

默认包扫描规则

  • @SpringBootApplication 标注的类就是主程序类
  • SpringBoot 会默认扫描主程序所在的包及其子包, 即自动的 component-scan 功能
  • 可自定义扫描路径
    • @SpringBootApplication(scanBasePackages = “com.fredo”)
    • @ComponentScan(“com.fredo”) 直接指定扫描的路径

配置默认值

  • 配置文件的所有配置项和某个类的对象值进行一一绑定
  • 绑定了配置文件中每一项值的类称为: 属性类
  • 参照官方文档:或者参照绑定的属性类

按需加载

  • 场景启动器除了导入相关功能依赖, 还会导入一个spring-boot-starter
  • spring-boot-starter, 是所有starterstarter, 基础核心starter
  • spring-boot-starter会导入包spring-boot-autoconfigure. 包里面都是全场景的 AutoConfiguration 自动配置类
  • 虽然全场景的自动配置都在包:spring-boot-autoconfigure, 但并不会全都开启
    • 根据条件开启
    • @ConditionalOnXxx
    • @ConditionalOnMissingXxx

小结一下: 导入场景启动器, 触发spring-boot-autoconfigure这个包的自动配置生效, 容器中就会具有相关场景的功能

自动配置流程细节梳理

  1. 导入场景启动器, 以spring-boot-starter-web为例
    • 场景启动器就会导入相关场景的所有依赖, 如starter-json,starter-tomcat, springmvc
    • 每个场景启动器都会引入一个spring-boot-starter, 核心场景启动器
    • 核心场景启动器会引入包:spring-boot-autoconfigure
    • spring-boot-autoconfigure里面包含所有场景的所有配置
    • 只要这个包下的所有类都能生效, 那么SpringBoot官方的整合功能就能生效
    • SpringBoot 默认扫描不到spring-boot-autoconfigure下的所有配置类(这些配置类给我们做了整合操作), 默认只扫描主程序所在的包
  2. 主程序:@SpringBootApplication
    • @SpringBootApplication由三个注解组成: @SpringBootConfiguration, @EnableAutoConfiguratio, @ComponentScan
    • SpringBoot 默认只扫描主程序所在的包及其下子包, 扫描不到spring-boot-autoconfigure包中的配置类
    • @EnableAutoConfiguration: SpringBoot 开启自动配置的核心
      • 是由@Import(AutoConfigurationImportSelector.class)提供功能:批量给容器中导入组件
      • SpringBoot 默认加载所有的配置类(SpringBoot3.1.0有146个)
      • 这146个配置类来自于spring-boot-autoconfigure下 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件指定
      • 项目启动的时候利用 @Import 批量导入组件机制, 把 autoconfigure 包下的自动配置类: xxxAutoConfiguration 导入进来
    • 按需生效
      • 这146个自动配置类并不全都生效
      • 每个自动配置类都有条件注解@ConditionalOnXxx, 只有条件成立, 才能生效
  3. xxxAutoConfiguration自动配置类
    • 给容器中使用@Bean放一堆组件
    • 每个自动配置类都可能有这个注解@EnableConfigurationProperties(XxxProperties.class), 用来把配置文件中配的指定前缀的属性值封装到xxxProperties属性类中
    • Tomcat为例: 把服务器的所有配置都是以server开头. 配置都封装到了属性类中
    • 给容器中放的所有组件的一些核心参数, 都来自于XxxProperties. XxxProperties都是和配置文件绑定
    • 只需要改配置文件的值, 核心组件的底层参数都能修改
  4. 只需关注业务, 全程无需关心各种整合(底层这些已经整合完成)

小结一下:

  1. 导入starter, 就会导入autoconfigure
  2. autoconfigure包里有文件: META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports, 里面指定了所有启动要加载的自动配置类
  3. @EnableAutoConfiguration会自动的把上面文件里面写的所有自动配置类都导入进来
  4. xxxAutoConfiguration是有条件注解进行按需加载
  5. xxxAutoConfiguration给容器中导入许多组件, 组件都是从xxxProperties中提取属性值
  6. xxxProperties又和配置文件进行了绑定

达到的效果: 导入starter, 修改配置文件, 就能修改底层行为