Springboot速览
一、SpringBoot 基础概述
1、SpringBoot 是什么?
SpringBoot 是 简化Spring开发的快速开发框架。基于Spring,遵循约定大于配置,消灭繁琐XML配置、实现自动装配、内置web容器,可快速开发独立可执行Java应用。
2、三大核心特性 🔴
-
自动配置:根据项目依赖、运行环境自动装配Bean,无需手动编写配置。
-
起步依赖 Starter:依赖整合封装,一键引入全套相关依赖,无需管控版本。
-
内置Web容器:内置Tomcat,无需外置服务器,直接Jar包运行。
3、Spring vs SpringBoot 区别
| 对比维度 | Spring | SpringBoot |
|---|---|---|
| 配置方式 | 大量XML、配置繁琐 | 零XML、注解驱动、自动配置 |
| 依赖管理 | 手动导入、容易版本冲突 | Starter一键导入、官方管控版本 |
| Web容器 | 外置Tomcat,打War包部署 | 内置Tomcat,直接Jar运行 |
| 入门难度 | 复杂、学习成本高 | 简单、开箱即用、低侵入 |
二、SpringBoot 自动配置原理 🔴
1、核心启动注解
启动类核心注解:@SpringBootApplication,由三个注解复合组成:
-
@Configuration:标识当前类为配置类。
-
@ComponentScan:自动扫描当前包及子包下所有Bean。
-
@EnableAutoConfiguration:开启自动配置(核心注解)。
2、自动配置执行流程
-
启动类注解开启自动配置;
-
底层通过 SPI机制 读取固定配置文件;
-
加载所有场景自动配置类(WebMvc、DataSource等);
-
使用条件注解判断是否满足创建Bean条件;
-
满足条件则自动注入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、标准启动流程
-
执行main方法,创建SpringApplication对象;
-
加载启动引导器、监听器、初始化器;
-
执行run方法,准备运行环境、加载配置文件;
-
创建ApplicationContext IOC容器;
-
刷新容器:扫描Bean、自动配置、初始化单例Bean;
-
初始化内置Tomcat容器;
-
启动完成,项目正常运行。
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)远程配置(生产核心)
-
Spring Cloud Config:拉取Git仓库远程yml;
-
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重复注入、依赖冲突;
-
数据库、中间件连接失败。