SpringBoot原理学习笔记
一、配置优先级
1. 配置文件优先级
SpringBoot支持三种配置文件格式:
- application.properties
- application.yml
- application.yaml
优先级从高到低:
- properties > yml > yaml
- 推荐统一使用yml格式
2. 外部配置方式
除了配置文件,还支持:
- Java系统属性:
-Dkey=value
- 命令行参数:
--key=value
五种配置方式优先级: 命令行参数 > 系统属性 > properties > yml > yaml
3. 打包后配置
运行jar包时指定参数:
|
|
二、Bean管理
1. Bean作用域
Spring支持五种作用域:
- singleton(默认):单例
- prototype:每次使用创建新实例
- request(web):每次HTTP请求
- session(web):每个HTTP会话
- application(web):整个Web应用生命周期
使用@Scope注解配置:
|
|
2. 第三方Bean管理
当引入第三方依赖时,无法使用@Component注解,需要使用@Bean:
方式1:在启动类中声明
|
|
方式2(推荐):使用配置类
|
|
三、SpringBoot原理
1. 起步依赖原理
- 通过Maven的依赖传递实现
- 如
spring-boot-starter-web
会自动引入web开发所需的所有依赖 - 简化了依赖管理
2. 自动配置原理
核心注解@SpringBootApplication
包含:
@SpringBootConfiguration
:标识为配置类@ComponentScan
:组件扫描@EnableAutoConfiguration
:自动配置核心
自动配置流程:
- 通过
@Import(AutoConfigurationImportSelector.class)
导入配置 AutoConfigurationImportSelector
读取META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
文件- 加载文件中定义的配置类
- 配置类中通过
@Bean
声明bean
3. 条件装配
使用@Conditional
系列注解控制bean的注册:
常用条件注解:
@ConditionalOnClass
:存在指定类时注册@ConditionalOnMissingBean
:不存在指定bean时注册@ConditionalOnProperty
:配置文件中存在指定属性时注册
4. 自定义Starter
标准结构:
xxx-spring-boot-starter
:依赖管理xxx-spring-boot-autoconfigure
:自动配置
实现步骤:
- 创建starter模块管理依赖
- 创建autoconfigure模块实现自动配置
- 在autoconfigure中:
- 定义配置类用
@Bean
声明bean - 在
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
中注册配置类
- 定义配置类用
示例:阿里云OSS Starter
- starter模块pom引入autoconfigure
- autoconfigure模块:
- 定义
AliyunOSSProperties
保存配置 - 定义
AliyunOSSOperator
工具类 - 创建
AliyunOSSAutoConfiguration
配置类
1 2 3 4 5 6 7 8
@Configuration @EnableConfigurationProperties(AliyunOSSProperties.class) public class AliyunOSSAutoConfiguration { @Bean public AliyunOSSOperator aliyunOSSOperator(AliyunOSSProperties properties) { return new AliyunOSSOperator(properties); } }
- 定义
- 创建
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
文件指定配置类
使用:
- 引入starter依赖
- 配置application.yml
- 直接注入使用:
|
|
总结
- SpringBoot通过起步依赖简化依赖管理
- 通过自动配置简化bean配置
- 理解原理后可以自定义starter复用通用组件
- 条件装配使配置更加灵活智能