当前位置: 首页 > news >正文

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服务。
步骤
  1. 创建模块:首先需要创建一个名为aliyun-oss-spring-boot-starter的模块,这个模块将作为其他项目的依赖。
  2. 引入自动配置模块:接着,创建另一个名为aliyun-oss-spring-boot-autoconfigure的模块,并在aliyun-oss-spring-boot-starter中引入该模块。aliyun-oss-spring-boot-autoconfigure模块负责实现自动配置功能。
  3. 定义自动配置:在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 对象,完全自动装配!


✅ 补充建议

  1. IDE提示支持:添加 spring-configuration-metadata.json 提示(通过 @ConfigurationProperties 自动生成)
  2. 生产发布:可将模块发布到私有或公共Maven仓库(如Nexus、JCenter、Maven Central)
  3. 版本管理:遵循语义化版本号(如 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 的标准开发流程。

http://www.dtcms.com/a/325168.html

相关文章:

  • 【走进Docker的世界】深入理解Docker网络:从模式选择到实战配置
  • #Datawhale AI夏令营#第三期全球AI攻防挑战赛(AIGC技术-图像方向)
  • [Shell编程] Shell的正则表达式
  • P3232 [HNOI2013] 游走,solution
  • Python 程序设计讲义(68):Python 的文件操作——使用os模块操作文件
  • 整数规划-分支定界
  • Win10清理C盘步骤
  • 展锐平台(Android15)WLAN热点名称修改不生效问题分析
  • 最大子数组和-一维动态规划
  • C++ 黑马 引用
  • 一款轻量、免费、无广告,强大的演示工具,支持屏幕放大、涂鸦、截图、录屏
  • PostgreSQL因为A/B switch以及group表过多导致WAL full的情况讨论
  • 托福单词词组积累 2025-08-10
  • 大模型 MCP服务案例详细讲解
  • 线程池的核心线程数与最大线程数怎么设置
  • NVIDIA Jetson AGX Orin 全景解析——边缘计算的高性能选择
  • 攻击实验(ARP欺骗、MAC洪范、TCP SYN Flood攻击、DNS欺骗、DHCP饿死)
  • VGG改进(1):基于Global Attention模块的详解与实战
  • RL代码实践 02——策略迭代
  • ai生成完成后语音通知
  • Starlink卫星终端对星策略是终端自主执行的还是网管中心调度的?
  • 如何部署图床系统 完整教程
  • python魔法属性__module__与__class__介绍
  • 学习numpy详解
  • Shell脚本-其他变量定义
  • 全面了解机器语言之kmeans
  • Redis缓存穿透、缓存击穿、缓存雪崩
  • Mock与Stub
  • 组合期权:水平价差
  • day29 消息队列