SpringBoot原理笔记
一、配置优先级
(一)核心配置文件优先级
SpringBoot支持application.properties、application.yml、application.yaml三种配置文件,优先级从高到低为:
application.properties(最高)application.ymlapplication.yaml(最低)
测试验证:
- 三者共存时,
properties配置生效(如Tomcat端口优先取properties的8081) yaml与yml共存时,yml配置生效- 开发建议:统一使用
yml格式(主流选择)
(二)扩展配置方式及优先级
除核心配置文件外,支持两种外部配置方式,完整优先级排序(从高到低):
- 命令行参数(格式:
--key=value,如--server.port=10010) - Java系统属性(格式:
-Dkey=value,如-Dserver.port=9000) application.propertiesapplication.ymlapplication.yaml
(三)配置方式使用
- 开发环境(IDEA):
- 编辑启动配置 →
Modify options→ 勾选Add VM options(配置系统属性)和Program arguments(配置命令行参数)
- 编辑启动配置 →
- 生产环境(打包后):
- 命令格式:
java -Dserver.port=9000 -jar XXX.jar --server.port=10010(命令行参数优先级更高)
- 命令格式:
- 注意事项:打包需引入
spring-boot-maven-plugin插件(官网骨架项目自动添加)
二、Bean的管理
(一)Bean的作用域
Spring支持5种作用域,后3种仅web环境生效:
| 作用域 | 说明 | 生效环境 |
|---|---|---|
| singleton | 单例(默认),容器启动时创建 | 所有环境 |
| prototype | 多例,每次获取时创建新实例 | 所有环境 |
| request | 每个HTTP请求创建一个实例 | web环境 |
| session | 每个HTTP会话创建一个实例 | web环境 |
| globalSession | 全局会话共享一个实例(Portlet环境) | web环境(Portlet) |
配置方式 :使用@Scope注解(如@Scope("prototype"))
关键说明:
- 单例Bean默认容器启动时创建,可通过
@Lazy注解延迟到首次使用时初始化 - 实际开发中90%以上Bean使用单例,无需手动配置
scope
(二)第三方Bean管理
1. 场景说明
第三方依赖中的类(如阿里云OSS工具类)无法添加@Component及其衍生注解,需通过@Bean注解声明Bean。
2. 配置方式
- 直接在启动类声明(不推荐):
java
@SpringBootApplication
public class Application {
@Bean // 方法名默认作为Bean名称,可通过name/value属性指定
public AliyunOSSOperator aliyunOSSOperator(AliyunOSSProperties properties) {
return new AliyunOSSOperator(properties); // 依赖Bean直接通过形参注入
}
}
- 集中配置类(推荐):
java
@Configuration // 标识配置类
public class OSSConfig {
@Bean
public AliyunOSSOperator aliyunOSSOperator(AliyunOSSProperties properties) {
return new AliyunOSSOperator(properties);
}
}
三、SpringBoot核心原理
SpringBoot的核心优势是简化配置 ,底层依赖两大核心机制:起步依赖 和自动配置。
(一)起步依赖(Starter)
1. 解决问题
传统Spring开发需手动管理大量依赖及版本冲突,起步依赖通过Maven依赖传递自动引入所需依赖。
2. 原理
- 起步依赖本质是Maven依赖组合,如
spring-boot-starter-web包含Tomcat、SpringMVC、JSON等web开发必备依赖 - 命名规范:官方 starter 命名为
spring-boot-starter-xxx(如spring-boot-starter-jdbc),第三方 starter 命名为xxx-spring-boot-starter(如mybatis-spring-boot-starter)
(二)自动配置(AutoConfiguration)
1. 核心目标
SpringBoot启动时自动加载所需配置类和Bean,无需手动XML或注解配置。
2. 实现流程(源码跟踪)
-
入口注解:
@SpringBootApplication(组合3个核心注解)@SpringBootConfiguration:标识启动类为配置类(底层含@Configuration)@ComponentScan:扫描启动类所在包及子包的@Component注解Bean@EnableAutoConfiguration:自动配置核心注解(关键)
-
@EnableAutoConfiguration原理:- 底层通过
@Import(AutoConfigurationImportSelector.class)导入配置选择器 AutoConfigurationImportSelector的selectImports()方法读取所有依赖中META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件- 该文件中配置了所有自动配置类(如
GsonAutoConfiguration、DataSourceAutoConfiguration),SpringBoot会加载这些配置类并注册Bean
- 底层通过
-
条件装配(
@Conditional系列注解)自动配置类并非无条件生效,需满足特定条件才会注册Bean,核心条件注解:
| 注解 | 作用 |
|---------------------|---------------------------------------|
|
@ConditionalOnClass| 环境中存在指定类才生效(如Gson.class) ||
@ConditionalOnMissingBean| 环境中不存在指定Bean才生效(避免覆盖用户自定义Bean) ||
@ConditionalOnProperty| 配置文件中存在指定属性及值才生效(如name: itheima) |
示例:Gson自动配置类
java
@AutoConfiguration // 标识自动配置类
@ConditionalOnClass(Gson.class) // 存在Gson依赖才生效
@EnableConfigurationProperties(GsonProperties.class)
public class GsonAutoConfiguration {
@Bean
@ConditionalOnMissingBean // 用户未自定义Gson时才自动配置
public Gson gson(GsonBuilder builder) {
return builder.create();
}
}
(三)自定义Starter(实战)
1. 场景
封装通用功能(如阿里云OSS)为Starter,供多个项目复用,简化配置。
2. 实现步骤(以aliyun-oss-spring-boot-starter为例)
-
创建两个模块:
aliyun-oss-spring-boot-starter:依赖管理模块(仅声明依赖,无业务代码)aliyun-oss-spring-boot-autoconfigure:自动配置模块(核心代码)
-
依赖管理模块(starter):
xml
<<dependencies>
<!-- 引入自动配置模块 -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-oss-spring-boot-autoconfigure</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</</dependencies>
-
自动配置模块(autoconfigure):
- 步骤1:编写属性封装类(绑定配置文件)
java@Data @ConfigurationProperties(prefix = "aliyun.oss") // 绑定配置前缀 public class AliyunOSSProperties { private String endpoint; private String bucketName; }- 步骤2:编写工具类(无需
@Component)
javapublic class AliyunOSSOperator { private final AliyunOSSProperties properties; // 构造注入属性 public AliyunOSSOperator(AliyunOSSProperties properties) { this.properties = properties; } // 文件上传、下载等业务方法... }- 步骤3:编写自动配置类
java@Configuration @EnableConfigurationProperties(AliyunOSSProperties.class) // 启用属性绑定 @ConditionalOnClass(AliyunOSSOperator.class) // 存在工具类才生效 public class AliyunOSSAutoConfiguration { @Bean @ConditionalOnMissingBean public AliyunOSSOperator aliyunOSSOperator(AliyunOSSProperties properties) { return new AliyunOSSOperator(properties); } }-
步骤4:配置自动配置文件
在resources/META-INF/spring/下创建org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,添加:com.aliyun.oss.AliyunOSSAutoConfiguration
-
测试使用:
- 引入Starter依赖
- 配置文件添加:
yamlaliyun: oss: endpoint: https://oss-cn-beijing.aliyuncs.com bucketName: test-bucket- 直接注入使用:
java@RestController public class UploadController { @Autowired private AliyunOSSOperator ossOperator; // 文件上传接口... }
四、核心总结
- 配置优先级:命令行参数 > Java系统属性 > properties > yml > yaml
- Bean管理:单例为默认作用域,第三方Bean通过
@Bean+配置类声明 - SpringBoot原理:
- 起步依赖:Maven依赖传递,简化依赖管理
- 自动配置:通过
@EnableAutoConfiguration加载配置文件中的自动配置类,结合@Conditional条件装配Bean
- 自定义Starter:分离依赖管理和自动配置,通过配置文件暴露自动配置类,实现功能复用