目录
1. 创建模块:aliyun-oss-spring-boot-autoconfigure
3. 创建 OSS 操作工具类:AliyunOSSOperator.java
4. 创建自动配置类:OssAutoConfiguration.java
5. 注册自动配置类:META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
1. 创建模块:aliyun-oss-spring-boot-starter
- 场景:在实际开发中,经常会定义一些公共组件,提供给各个项目团队使用。而在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 和 setter
public 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;
}
@PreDestroy
public 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.com
access-key-id: your-access-key-id
access-key-secret: your-access-key-secret
bucket-name: my-bucket
注入并使用
@Service
public class FileService {
@Autowired
private 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 的标准开发流程。