Springboot速览

一、SpringBoot 基础概述

1、SpringBoot 是什么?

SpringBoot 是 简化Spring开发的快速开发框架。基于Spring,遵循约定大于配置,消灭繁琐XML配置、实现自动装配、内置web容器,可快速开发独立可执行Java应用。

2、三大核心特性 🔴

  1. 自动配置:根据项目依赖、运行环境自动装配Bean,无需手动编写配置。

  2. 起步依赖 Starter:依赖整合封装,一键引入全套相关依赖,无需管控版本。

  3. 内置Web容器:内置Tomcat,无需外置服务器,直接Jar包运行。

3、Spring vs SpringBoot 区别

对比维度 Spring SpringBoot
配置方式 大量XML、配置繁琐 零XML、注解驱动、自动配置
依赖管理 手动导入、容易版本冲突 Starter一键导入、官方管控版本
Web容器 外置Tomcat,打War包部署 内置Tomcat,直接Jar运行
入门难度 复杂、学习成本高 简单、开箱即用、低侵入

二、SpringBoot 自动配置原理 🔴

1、核心启动注解

启动类核心注解:@SpringBootApplication,由三个注解复合组成:

  1. @Configuration:标识当前类为配置类。

  2. @ComponentScan:自动扫描当前包及子包下所有Bean。

  3. @EnableAutoConfiguration:开启自动配置(核心注解)。

2、自动配置执行流程

  1. 启动类注解开启自动配置;

  2. 底层通过 SPI机制 读取固定配置文件;

  3. 加载所有场景自动配置类(WebMvc、DataSource等);

  4. 使用条件注解判断是否满足创建Bean条件;

  5. 满足条件则自动注入Bean到IOC容器。

3、SPI机制

SPI:服务提供者接口,作用是解耦框架与第三方组件

SpringBoot固定读取路径:META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

4、常用条件注解 🔴

条件注解 作用说明
@ConditionalOnClass 指定Class存在时,才创建Bean
@ConditionalOnMissingBean 容器没有该Bean时,才自动创建(用户优先)
@ConditionalOnProperty 配置文件满足条件时才生效
@ConditionalOnWebApplication 仅在Web环境下生效

三、SpringBoot 启动流程 & 扩展点

1、标准启动流程

  1. 执行main方法,创建SpringApplication对象;

  2. 加载启动引导器、监听器、初始化器;

  3. 执行run方法,准备运行环境、加载配置文件;

  4. 创建ApplicationContext IOC容器;

  5. 刷新容器:扫描Bean、自动配置、初始化单例Bean;

  6. 初始化内置Tomcat容器;

  7. 启动完成,项目正常运行。

2、SpringBoot 扩展点

核心定位:框架预留扩展接口,可在启动前、启动中、启动后自定义业务逻辑,实现解耦扩展。

(1)ApplicationContextInitializer【启动最早】

执行时机:容器创建之前

作用:预处理环境变量、修改系统配置、提前加载配置源。

(2)SpringApplicationRunListener【全程监听】

执行时机:run()方法全过程监听

生命周期节点:starting → environmentPrepared → contextPrepared → contextLoaded → started → running

(3)BeanPostProcessor【Bean加工】

执行时机:Bean实例化前后(隶属于Spring底层)。

作用:修改Bean、动态代理、属性填充。

(4)ApplicationRunner / CommandLineRunner【启动最后】

执行时机:项目启动成功、Tomcat运行完毕后

使用场景:初始化字典、预热缓存、打印启动日志、初始化数据。

3、扩展点总结

  • 启动前:ApplicationContextInitializer,预处理环境;

  • 启动中:RunListener监听流程、Bean后置处理器加工Bean;

  • 启动后:ApplicationRunner执行初始化业务。

四、配置文件(本地+远程)

1、两种配置文件

  • application.properties:键值对格式,冗余繁琐;

  • application.yml:树形层级、简洁直观、企业主流。

2、多环境配置

环境隔离,区分开发、测试、生产:

  • application-dev.yml(开发环境)

  • application-test.yml(测试环境)

  • application-prod.yml(生产环境)

环境激活方式:spring.profiles.active=dev

3、配置注入三大注解(承接Spring)

注解 使用场景 特点
@Value 零散、少量简单配置 单个注入、无类型校验
@PropertySource 加载自定义外部配置文件 专门加载properties文件
@ConfigurationProperties 一组关联同类配置 批量绑定、类型安全、支持校验

4、配置加载优先级(从高到低)

命令行参数 > 外部配置文件 > 内部yml > 内部properties

5、配置高级进阶

(1)YML统一规范

企业强制使用yml,层级清晰、可读性强;语法要求:冒号后必须空格、层级严格缩进

(2)自定义配置文件

  • 普通自定义:@PropertySource 加载本地自定义properties;

  • 批量自定义:@ConfigurationProperties 绑定自定义前缀。

(3)远程配置(生产核心)

  1. Spring Cloud Config:拉取Git仓库远程yml;

  2. Nacos配置中心(主流):可视化远程配置、动态刷新。

(4)动态刷新配置

注解:@RefreshScope,作用:修改远程配置无需重启服务,自动刷新Bean。

6、配置加载原理

SpringBoot 通过 Environment 环境对象统一收纳所有配置:本地配置、系统变量、JVM参数、命令行、远程配置,全局统一读取。

五、Starter 起步依赖

1、核心作用

Starter = 依赖整合 + 自动配置类,一键引入全套依赖,无需手动管理版本、无需手写配置。

2、常用 Starter

  • spring-boot-starter-web:Web开发(MVC、Tomcat、JSON)

  • spring-boot-starter-jdbc:数据库JDBC连接

  • spring-boot-starter-data-redis:Redis整合

  • mybatis-plus-boot-starter:MyBatis-Plus持久层框架

六、内置Web容器

1、默认容器

SpringBoot 默认内置 Tomcat,无需外置服务器,直接Jar包运行。

2、主流容器对比(可替换)

  • Tomcat:默认、稳定通用、适配绝大多数项目;
  • Jetty:轻量、适合长连接、嵌入式服务;
  • Undertow:高性能、高并发、无锁机制。

七、SpringBoot常用功能

1、全局异常处理

注解:@RestControllerAdvice + @ExceptionHandler

作用:统一捕获Controller层异常,统一返回格式,避免重复try-catch。

2、统一返回结果

自定义通用实体类ResultVO:code状态码、msg提示信息、data业务数据,前后端分离项目强制统一。

3、异步任务

开启注解:@EnableAsync;执行注解:@Async

作用:异步执行耗时任务,不阻塞主线程;场景:短信、邮件、日志记录。

4、定时任务

开启注解:@EnableScheduling;执行注解:@Scheduled

支持cron表达式;场景:定时清理、定时统计、数据同步。

5、参数校验

依赖validation包,常用注解:@NotBlank、@NotNull、@Length,简化代码if判断,规范接口入参。

6、日志配置

默认集成logback,无需手动配置;日志级别:trace < debug < info < warn < error

八、SpringBoot 事务(承接Spring)

  • 开启方式:无需配置,直接使用 @Transactional

  • 底层原理:AOP + 动态代理;

  • 事务失效场景:内部调用、非public方法、异常捕获不抛出、数据库引擎不支持;

  • 传播行为、隔离级别、回滚规则完全沿用Spring。

九、总结

1、自动配置为什么不用手动写Bean?

SPI加载自动配置类 + 条件注解判断,用户未自定义Bean时,框架自动装配默认Bean。

2、SpringBoot 为什么不需要web.xml?

内置Tomcat容器,全程注解驱动,彻底舍弃XML配置文件。

3、Jar 与 War 区别

  • Jar:内置Tomcat,命令行java -jar直接运行(企业主流);

  • War:外置Tomcat,放入服务器容器部署。

4、启动失败常见原因

  • 端口占用、配置文件语法错误;

  • Bean重复注入、依赖冲突;

  • 数据库、中间件连接失败。