tlias智能学习辅助系统--原理篇-SpringBoot原理-自动配置-自定义starter
目录
自定义starter
需求
目标
步骤
自定义starter实操步骤
✅ 一、项目结构设计
✅ 二、创建父工程(可选)
✅ 三、创建 autoconfigure 模块(核心逻辑)
1. 创建模块:aliyun-oss-spring-boot-autoconfigure
pom.xml
2. 定义配置属性类:OssProperties.java
3. 创建 OSS 操作工具类:AliyunOSSOperator.java
4. 创建自动配置类:OssAutoConfiguration.java
5. 注册自动配置类:META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
✅ 四、创建 starter 模块
1. 创建模块:aliyun-oss-spring-boot-starter
pom.xml
✅ 五、发布或安装到本地仓库(测试用)
✅ 六、在其他Spring Boot项目中使用
添加依赖
配置 application.yml
注入并使用
✅ 七、效果验证
✅ 补充建议
- 场景:在实际开发中,经常会定义一些公共组件,提供给各个项目团队使用。而在Spring Boot的项目中,一般会将这些公共组件封装为Spring Boot的starter(包含了起步依赖和自动配置的功能)。
自定义starter
需求
- 目标:自定义
aliyun-oss-spring-boot-starter
,完成阿里云OSS操作工具类AliyunOSSOperator
的自动配置。
目标
- 期望结果:引入起步依赖后,可以直接注入
AliyunOSSOperator
并使用阿里云OSS服务。
步骤
- 创建模块:首先需要创建一个名为
aliyun-oss-spring-boot-starter
的模块,这个模块将作为其他项目的依赖。 - 引入自动配置模块:接着,创建另一个名为
aliyun-oss-spring-boot-autoconfigure
的模块,并在aliyun-oss-spring-boot-starter
中引入该模块。aliyun-oss-spring-boot-autoconfigure
模块负责实现自动配置功能。 - 定义自动配置:在
aliyun-oss-spring-boot-autoconfigure
模块中,定义自动配置功能,并创建自动配置文件META-INF/spring/factories
(注意,图片中的xxxx.imports
应为factories
),用于指定自动配置类
自定义starter实操步骤
我们将按照需求,一步一步实现自定义 aliyun-oss-spring-boot-starter
,让开发者在引入该依赖后可以直接注入 AliyunOSSOperator
使用阿里云OSS服务。
✅ 一、项目结构设计
aliyun-oss-spring-boot-starter-parent/
├── aliyun-oss-spring-boot-starter/ # 起步依赖模块(空壳,只引入autoconfigure)
└── aliyun-oss-spring-boot-autoconfigure/ # 自动配置核心模块(含配置类、条件装配等)
推荐使用 Maven 多模块项目来管理。
✅ 二、创建父工程(可选)
<!-- pom.xml (parent) -->
<groupId>com.example</groupId>
<artifactId>aliyun-oss-spring-boot-starter-parent</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging><modules><module>aliyun-oss-spring-boot-autoconfigure</module><module>aliyun-oss-spring-boot-starter</module>
</modules><properties><spring-boot.version>3.2.6</spring-boot.version><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target>
</properties><dependencyManagement><dependencies><!-- 引入 Spring Boot 依赖管理 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
✅ 三、创建 autoconfigure 模块(核心逻辑)
1. 创建模块:aliyun-oss-spring-boot-autoconfigure
pom.xml
<groupId>com.example</groupId>
<artifactId>aliyun-oss-spring-boot-autoconfigure</artifactId>
<version>1.0.0</version><dependencies><!-- Spring Boot 自动配置支持 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId></dependency><!-- Spring Boot 配置处理器(用于提示元数据生成) --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><!-- 阿里云OSS SDK --><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.17.2</version></dependency><dependency><groupId>jakarta.annotation</groupId><artifactId>jakarta.annotation-api</artifactId></dependency>
</dependencies>
2. 定义配置属性类:OssProperties.java
package com.example.aliyunossspringbootautoconfigure;import org.springframework.boot.context.properties.ConfigurationProperties;@ConfigurationProperties(prefix = "aliyun.oss")
public class OssProperties {private String endpoint;private String accessKeyId;private String accessKeySecret;private String bucketName;// getter 和 setterpublic String getEndpoint() {return endpoint;}public void setEndpoint(String endpoint) {this.endpoint = endpoint;}public String getAccessKeyId() {return accessKeyId;}public void setAccessKeyId(String accessKeyId) {this.accessKeyId = accessKeyId;}public String getAccessKeySecret() {return accessKeySecret;}public void setAccessKeySecret(String accessKeySecret) {this.accessKeySecret = accessKeySecret;}public String getBucketName() {return bucketName;}public void setBucketName(String bucketName) {this.bucketName = bucketName;}
}
3. 创建 OSS 操作工具类:AliyunOSSOperator.java
package com.example.aliyunossspringbootautoconfigure;import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;public class AliyunOSSOperator {private final OSS ossClient;private final String bucketName;public AliyunOSSOperator(OssProperties properties) {this.bucketName = properties.getBucketName();this.ossClient = new OSSClientBuilder().build(properties.getEndpoint(), properties.getAccessKeyId(), properties.getAccessKeySecret());}public void upload(String objectName, byte[] content) {ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content));}public void delete(String objectName) {ossClient.deleteObject(bucketName, objectName);}// 其它方法...public void destroy() {if (ossClient != null) {ossClient.shutdown();}}
}
4. 创建自动配置类:OssAutoConfiguration.java
package com.example.aliyunossspringbootautoconfigure;import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import jakarta.annotation.PreDestroy;@Configuration
@EnableConfigurationProperties(OssProperties.class)
@ConditionalOnClass(AliyunOSSOperator.class)
public class OssAutoConfiguration {private AliyunOSSOperator ossOperator;@Bean@ConditionalOnMissingBean // 只有不存在时才创建public AliyunOSSOperator aliyunOSSOperator(OssProperties properties) {this.ossOperator = new AliyunOSSOperator(properties);return ossOperator;}@PreDestroypublic void destroy() {if (ossOperator != null) {ossOperator.destroy();}}
}
5. 注册自动配置类:META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
注意:Spring Boot 3.x 使用
org.springframework.boot.autoconfigure.AutoConfiguration.imports
文件代替旧的spring.factories
创建文件路径:
src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
内容为:
com.example.aliyunossspringbootautoconfigure.OssAutoConfiguration
✅ 这是关键!Spring Boot 启动时会扫描此文件加载自动配置类。
✅ 四、创建 starter 模块
1. 创建模块:aliyun-oss-spring-boot-starter
pom.xml
<groupId>com.example</groupId>
<artifactId>aliyun-oss-spring-boot-starter</artifactId>
<version>1.0.0</version><dependencies><!-- 引入自动配置模块 --><dependency><groupId>com.example</groupId><artifactId>aliyun-oss-spring-boot-autoconfigure</artifactId><version>1.0.0</version></dependency>
</dependencies>
✅ 这个模块只是一个“空壳”,作用是引入
autoconfigure
模块,方便用户一键引入。
✅ 五、发布或安装到本地仓库(测试用)
# 在父项目根目录执行
mvn clean install
这样就将两个模块安装到了本地Maven仓库。
✅ 六、在其他Spring Boot项目中使用
添加依赖
<dependency><groupId>com.example</groupId><artifactId>aliyun-oss-spring-boot-starter</artifactId><version>1.0.0</version>
</dependency>
配置 application.yml
aliyun:oss:endpoint: https://oss-cn-beijing.aliyuncs.comaccess-key-id: your-access-key-idaccess-key-secret: your-access-key-secretbucket-name: my-bucket
注入并使用
@Service
public class FileService {@Autowiredprivate AliyunOSSOperator ossOperator;public void uploadFile(byte[] data) {ossOperator.upload("test.jpg", data);}
}
✅ 七、效果验证
✅ 成功实现目标:
- 引入
aliyun-oss-spring-boot-starter
- 配置
aliyun.oss.*
参数 - 直接注入
AliyunOSSOperator
并使用
无需手动 new
对象,完全自动装配!
✅ 补充建议
- IDE提示支持:添加
spring-configuration-metadata.json
提示(通过@ConfigurationProperties
自动生成) - 生产发布:可将模块发布到私有或公共Maven仓库(如Nexus、JCenter、Maven Central)
- 版本管理:遵循语义化版本号(如
1.0.0
)
✅ 总结
步骤 | 内容 |
---|---|
1 | 创建 autoconfigure 模块,编写 OssProperties 和 OssAutoConfiguration |
2 | 创建 starter 模块,仅依赖 autoconfigure |
3 | 使用 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 注册自动配置类 |
4 | 用户引入 starter 后,自动装配生效 |
这就是 Spring Boot Starter 的标准开发流程。