SpringBoot原理
配置优先级
五种配置方式
- application.properties
- application.yml
- application.yaml
- Java系统属性配置 -Dkey=value
- 命令行参数: –key=value
优先级:命令行参数 > 系统属性参数 > properties参数 > yml参数 > yaml参数
启动jar包时指定Java系统属性配置和命令行参数:
1 | java -Dserver.port=9000 -jar XXXXX.jar --server.port=10010 |
Bean的管理
1. Bean的作用域配置
| 作用域 | 说明 |
|---|---|
| singleton | 容器内同名称的bean只有一个实例(单例)(默认) |
| prototype | 每次使用该bean时会创建新的实例(非单例) |
| request | 每个请求范围内会创建新的实例(web环境中,了解) |
| session | 每个会话范围内会创建新的实例(web环境中,了解) |
| application | 每个应用范围内会创建新的实例(web环境中,了解) |
- IOC容器中的bean默认使用的作用域:singleton (单例)
- 实际开发当中,绝大部分的Bean是单例的,也就是说绝大部分Bean不需要配置scope属性
- 默认singleton的bean,在容器启动时被创建,可以使用@Lazy注解来延迟初始化(延迟到第一次使用时)
2.管理第三方Bean对象
第三方Bean注入的两种方式:(使用第二种)
1 | // 方式1:启动类声明 |
- 通过
@Bean注解的name 或 value属性可以声明bean的名称,如果不指定,默认bean的名称就是方法名。 - 如果第三方bean需要依赖其他bean对象,直接在bean定义方法中设置形参即可,容器会根据类型自动装配。
SpringBoot工作原理
管理第三方Bean对象的时候,如果说这个包,它不在SpringBoot启动类同级目录或其子包下,那么如果不配置componScan注解,就扫描不到,但是一般不建议给第三方包配置这个扫描注解
第三方包的Bean管理常用方案:
- 在启动类中,@Import(普通类.class)
- 在启动类中,@Import(配置类.class)
- 在启动类中,@Import(ImportSelector接口实现类) 接口实现类重写selectImports()方法
上面三种方法的共同点,就是要对启动类进行操作,其实再封装一下,就只需要在启动类中加固定的注解就好了
自定义一个En接口,在接口上加上面三种注解中的一种,在启动类中直接加这个自定义注解就行了
1 |
|
原理分析
第一层: SpringBoot启动类上的注解:@SpringBootApplication
这个注解中有三个元注解:
- @SpringBootConfiguration
- @EnableAutoConfiguration
- @ComponentScan
第二层:
1. 首先看 @SpringBootConfiguration 注解,这个注解中包含:(第三层)@Configuration 注解 也就是配置类注解,这也是 启动类 能直接注入Bean对象的原因
2. 然后是 @EnableAutoConfiguration 注解,这个注解包含 (第三层)@Import 注解,导入了 ImportSelector接口实现类,重写了 selectImports()方法 ,在方法中调用 getAutoConfigurationEntry() 方法 ,此方法再调用getCandidateConfigurations() 方法获 取在配置文件中配置的所有自动配置类的集合
最底层 getCandidateConfigurations 方法的功能:获取所有基于
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件中配置类的集合
3. @ComponentScan 这个不必说,就是启动类能够扫描当前目录及子目录中注解的功能
状态注解:在自动配置类声明bean的时候,除了在方法上加了一个@Bean注解以外,还会经常用到一个注解,就是以Conditional开头的这一类的注解。以Conditional开头的这些注解都是条件装配的注解
- @ConditionalOnClass:判断环境中有对应字节码文件,才注册bean到IOC容器。
- @ConditionalOnMissingBean:判断环境中没有对应的bean(类型或名称),才注册bean到IOC容器。
- @ConditionalOnProperty:判断配置文件中有对应属性和值,才注册bean到IOC容器。
自定义starter
目标:封装阿里云 OSS SDK,实现开箱即用的 Starter,用户只需引入依赖即可自动注入 AliyunOSSOperator。
1. 创建 Starter 模块(依赖管理)
模块名:aliyun-oss-spring-boot-starter
作用:统一管理依赖,用户只需引入此 Starter。
关键步骤:
初始化 Maven 项目
- 选择 Spring Boot 版本(如 3.2.8),不勾选任何依赖。
- 删除无关文件(如
src/main/java),仅保留pom.xml。
配置
pom.xml1
2
3
4
5
6
7
8<dependencies>
<!-- 引入 autoconfigure 模块 -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-oss-spring-boot-autoconfigure</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
2. 创建 Autoconfigure 模块(核心逻辑)
模块名:aliyun-oss-spring-boot-autoconfigure
作用:实现自动配置逻辑,定义 Bean 和配置文件。
2.1 准备代码
拷贝原有工具类
- 将
AliyunOSSOperator(OSS 操作工具类)和AliyunOSSProperties(配置类)复制到本模块。 - 移除
@Component、@Autowired(因为 Starter 需手动管理 Bean)。
- 将
改造
AliyunOSSOperator添加构造函数,接收 AliyunOSSProperties
1
2
3
4
5
6
7
8
9
10public class AliyunOSSOperator {
private final AliyunOSSProperties properties;
// 必须提供构造函数(Spring 依赖注入用)
public AliyunOSSOperator(AliyunOSSProperties properties) {
this.properties = properties;
}
// 其他方法(upload/listFiles/deleteFile等)
}
改造
AliyunOSSProperties添加 @ConfigurationProperties 绑定配置文件:
1
2
3
4
5
6
7
8// 绑定 yml 配置
public class AliyunOSSProperties {
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
// getters/setters...
}
2.2 定义自动配置类(相比于原来的类新增的,一个配置类)
创建
AliyunOSSAutoConfiguration1
2
3
4
5
6
7
8
9
10
// 启用配置绑定
public class AliyunOSSAutoConfiguration {
public AliyunOSSOperator aliyunOSSOperator(AliyunOSSProperties properties) {
// 通过构造函数注入配置
return new AliyunOSSOperator(properties);
}
}注册自动配置类
resources/META-INF/spring/ 下创建文件:
- 文件名:org.springframework.boot.autoconfigure.AutoConfiguration.imports
- 内容 :com.aliyun.oss.AliyunOSSAutoConfiguration
2.3 配置依赖
1 | <dependencies> |
3. 用户使用 Starter
3.1 引入依赖
1 | <dependency> |
3.2 配置参数(application.yml)
1 | aliyun: |
3.3 直接注入使用
1 |
|
关键问题解答
1. 为什么需要构造函数?
- 原因:Spring 无法通过
@Component自动实例化第三方类,需手动在@Bean方法中构造对象。 - 解决:在
AliyunOSSOperator中显式定义构造函数,供AliyunOSSAutoConfiguration调用。
2. 配置如何生效?
@EnableConfigurationProperties将AliyunOSSProperties注册为 Bean。application.yml中的配置通过@ConfigurationProperties绑定到AliyunOSSProperties对象。
3. 自动配置触发条件
AutoConfiguration.imports文件告诉 Spring Boot 启动时加载AliyunOSSAutoConfiguration。- 用户无需手动
@Import或扫描包。
总结
- 对于二者的 pom.xml :
| 模块 | Starter(依赖入口) | Autoconfigure(实现逻辑) |
|---|---|---|
| 依赖内容 | 只依赖 autoconfigure 模块 |
依赖具体功能包(如阿里云SDK) |
| 文件内容 | 仅保留 pom.xml |
保留 src/ + pom.xml |
| 必须修改项 | 添加对 autoconfigure 的依赖 |
添加阿里云OSS SDK等具体依赖 |
最难理解的地方:
**
AliyunOSSProperties**:- 通过
@EnableConfigurationProperties直接在配置类中注册为 Bean
**
AliyunOSSOperator**:- 通过构造函数接收容器中的
AliyunOSSPropertiesBean。 - 无需手动创建或注入,完全由 Spring 管理。
- 通过
