tlias智能学习辅助系统--原理篇-SpringBoot原理-自动配置-自定义starter

发布于:2025-08-11 ⋅ 阅读:(13) ⋅ 点赞:(0)

目录

自定义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 和 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 对象,完全自动装配!


✅ 补充建议

  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 的标准开发流程。


网站公告

今日签到

点亮在社区的每一天
去签到