spring_boot复习
基础定位
SpringBoot = Spring 框架 + 自动配置 + 嵌入式容器 + Starter 启动器
核心目标:简化 Spring 繁杂 XML 配置,约定优于配置,快速独立搭建 Java 应用;内置 Tomcat/Jetty/Undertow,可直接打成 jar 独立运行。
SpringBoot 和 Spring 的区别
- Spring:原生框架,需要手动配置 Bean、XML/JavaConfig、手动管理依赖版本,没有内置 web 容器
- 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 | |
- @Configuration:当前类是配置类,可以注册 Bean
- @ComponentScan:默认扫描当前启动类所在包及其子包(启动类放根包,否则无法扫描到 service/controller)
- @EnableAutoConfiguration:开启自动配置(核心)
application.yml/bootstrap.yml 区别
application.yml:SpringBoot 原生配置文件,普通配置、业务参数
bootstrap.yml:由 SpringApplication 上下文(父上下文)优先加载,优先级更高;SpringCloud 专属
适用场景:Nacos 配置中心地址、应用名称、加密密钥;需要优先读取远程配置时使用。
单纯 SpringBoot 项目,bootstrap.yml 不会加载!
外部配置加载顺序
优先级从高到低(高优先级覆盖低优先级)
- 命令行启动参数
--server.port=8081 - 操作系统环境变量
- jar 包外部 application.yml
- jar 包内部 application.yml
- 默认配置
@ConfigurationProperties vs @Value
- @Value:单个属性注入,不支持批量、不支持校验、不支持松散绑定
- @ConfigurationProperties:批量绑定一组配置,支持前缀、JSR303 校验、松散绑定(user-name /userName)
开发规范:业务配置类优先使用 @ConfigurationProperties
SpringBoot 启动完整流程
1 | |
自动配置原理
- 注解引入
AutoConfigurationImportSelector - 读取
META-INF/spring.factories文件 - 文件内预定义大量自动配置类(WebMvcAutoConfiguration、DataSourceAutoConfiguration…)
- 使用条件注解
@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(外置容器)