spring_boot复习

基础定位

SpringBoot = Spring 框架 + 自动配置 + 嵌入式容器 + Starter 启动器

核心目标:简化 Spring 繁杂 XML 配置,约定优于配置,快速独立搭建 Java 应用;内置 Tomcat/Jetty/Undertow,可直接打成 jar 独立运行。

SpringBoot 和 Spring 的区别

  1. Spring:原生框架,需要手动配置 Bean、XML/JavaConfig、手动管理依赖版本,没有内置 web 容器
  2. SpringBoot:建立在 Spring 之上,提供自动配置、starter 依赖管理、约定优于配置、内嵌 web 容器

一句话:Spring 是容器框架,SpringBoot 是 Spring 的快速开发脚手架。

什么是 Starter?

Starter 是一套依赖聚合器 + 自动配置类

  • 统一管理相关依赖版本,不用手动导入一堆 jar、解决版本冲突
  • 引入 starter 后,自动装配相关 Bean
    例:spring-boot-starter-web(webmvc+tomcat)、spring-boot-starter-data-redis

parent 父工程:提供全部组件统一版本号,不需要手动写版本号。

@SpringBootApplication 复合注解

1
2
3
@Configuration
@EnableAutoConfiguration
@ComponentScan
  1. @Configuration:当前类是配置类,可以注册 Bean
  2. @ComponentScan:默认扫描当前启动类所在包及其子包(启动类放根包,否则无法扫描到 service/controller)
  3. @EnableAutoConfiguration:开启自动配置(核心)

application.yml/bootstrap.yml 区别

  1. application.yml:SpringBoot 原生配置文件,普通配置、业务参数

  2. bootstrap.yml:由 SpringApplication 上下文(父上下文)优先加载,优先级更高;SpringCloud 专属

     适用场景:Nacos 配置中心地址、应用名称、加密密钥;需要优先读取远程配置时使用。
    

单纯 SpringBoot 项目,bootstrap.yml 不会加载!

外部配置加载顺序

优先级从高到低(高优先级覆盖低优先级)

  1. 命令行启动参数 --server.port=8081
  2. 操作系统环境变量
  3. jar 包外部 application.yml
  4. jar 包内部 application.yml
  5. 默认配置

@ConfigurationProperties vs @Value

  1. @Value:单个属性注入,不支持批量、不支持校验、不支持松散绑定
  2. @ConfigurationProperties:批量绑定一组配置,支持前缀、JSR303 校验、松散绑定(user-name /userName)
    开发规范:业务配置类优先使用 @ConfigurationProperties

SpringBoot 启动完整流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SpringApplication.run(Main.class, args)
1. 初始化SpringApplication对象
- 推断应用类型(Web Servlet / WebFlux / 普通应用)
- 加载META-INF/spring.factories中的初始化器、监听器
2. run()方法启动
1) 创建监听器,发布启动事件
2) 准备环境Environment,加载所有配置文件
3) 创建ApplicationContext容器(ServletWebServerApplicationContext)
4) 准备上下文:加载Bean定义、资源
5) **刷新容器 refresh()【底层就是Spring IoC刷新流程】**
→ 执行自动配置、实例化Bean、后置处理器
6) 创建嵌入式Web容器(Tomcat)启动web服务
7) 执行Runner(ApplicationRunner、CommandLineRunner)
8) 发布启动完成事件

自动配置原理

  1. 注解引入 AutoConfigurationImportSelector
  2. 读取 META-INF/spring.factories 文件
  3. 文件内预定义大量自动配置类(WebMvcAutoConfiguration、DataSourceAutoConfiguration…)
  4. 使用条件注解 @Conditionalxxx 判断是否生效
    • @ConditionalOnClass:classpath 存在指定类才生效
    • @ConditionalOnMissingBean:容器不存在对应 Bean 才自动创建
    • @ConditionalOnProperty:配置文件存在对应参数才生效

核心思想:按需装配;用户手动定义 Bean > SpringBoot 自动配置 Bean 只要我们自己声明 Bean,自动配置的 Bean 就不会创建。

SPI 文件:spring.factories

SpringBoot2.x:使用 spring.factories
SpringBoot3.x:舍弃 spring.factories,改用 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

面试区分:2.x 和 3.x 自动配置文件变化!

内嵌 Tomcat 启动原理

普通 SpringWeb 项目:外部 Tomcat 扫描 war 包;
SpringBoot Jar 模式:
ApplicationContext 刷新完成后,触发 ServletWebServerApplicationContext,自动创建 Tomcat 实例,绑定内置 Servlet 容器,直接启动,不需要外部容器。
打包方式:jar(推荐)、war(外置容器)


spring_boot复习
http://hanqichuan.com/2021/03/09/java框架与工具/spring/spring_boot复习/
作者
韩启川
发布于
2021年3月9日
许可协议