【Java SpringBoot Starter】开发一个自己的SpringBoot Starter组件,应该怎么写,需要什么配置

文章介绍了如何开发一个自定义的SpringBootStarter组件,以文件上传功能为示例,涉及配置类、.properties文件、bean对象、factories文件、pom.xml管理和项目目录结构。通过Starter,可以将功能打包成jar,方便在多个项目中复用,减少重复工作。
摘要由CSDN通过智能技术生成

【Java SpringBoot Starter】开发一个自己的SpringBoot Starter组件,应该怎么写,需要什么配置

目录

思路:

1. 自定义的Starter,需要的Configuration 类

2.  .properties文件的配置,或者yml文件的配置内容,注入bean对象中

3. 业务上可以直接使用的bean对象

4. factories文件定义

5. maven pom文件依赖管理

6. 项目目录结构如下

 7. 业务项目如何使用



为什么需要写Starter?!

设想一下,你想完成一个这样的功能:文件的上传功能。所以你需要写一个类来完成具体的文件上传,同时还有些配置信息——properties文件,用来配置文件上传到服务端的一些连接信息。

等你完成这些功能后,你发现,这个功能在A项目需要,在B,C项目也需要这个文件上传功能,这个时候,我当然希望用最小的代价就能复用这些功能。通过Starter机制,我们可以把这个功能打成一个jar包,其他项目引用这个jar包就可以使用了,最方便。在项目启动的时候,spring 容器中就有了这个bean对象,我们只需要直接调用相关方法就可以了。

至此,我们就可以使用Spring boot Starter的机制,写一个starter来完成这个功能。

思路:

下面的starter虽然是一个示例,但是有一定的实际作用,这个starter是为了完成文件的上传功能,通过这个starter,在使用过程中,引用这个jar包就可以spring容器中有这个bean对象,在代码中实现文件的


ps: 类似还可以用在这些地方:

1) 系统监测——每隔一段时间打印一些日志,并输入到日志文件中,其他系统自动读取日志文件进行解析,来判断系统健康状态

2)... 

1. 自定义的Starter,需要的Configuration 类

package com.gfc.starter.config;

import com.gfc.starter.utils.MinIoUtils;
import org.springframework.beans.factory.annotation.Autowired;
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 io.minio.MinioClient;

/**
 * @description: minio配置类
 * @autuor xxx
 * @date 
 */

@Configuration
//启动minio配置功能,并加入到IOC容器中
@EnableConfigurationProperties(MinioProperties.class)
public class MinioConfiguration {
// 内部创建了2个bean对象


    @Autowired
    private MinioProperties minioProperties;

// 创建一个bean对象
    @Bean
    public MinioClient minioClient() {
        MinioClient client = null;
        try {
            client = MinioClient.builder()
                    .endpoint(minioProperties.getServerUrl())
                    .credentials(minioProperties.getAccessKey(),minioProperties.getSecretKey())
                    .build();
        }catch (Exception e){
            e.printStackTrace();
        }
        return client;
    }


// 这个其实是我们业务上用到的bean对象
    @ConditionalOnMissingBean(MinIoUtils.class)
    @Bean
    public MinIoUtils minIoUtils(){
        return new MinIoUtils();
    }
}

2.  .properties文件的配置,或者yml文件的配置内容,注入bean对象中

package com.gfc.starter.config;

import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.boot.context.properties.ConfigurationProperties;

/**
 * @description:
 * @autuor xxx
 * @date 2023
 */
@Data
@EqualsAndHashCode
@ConfigurationProperties(prefix = "minio.manager")
public class MinioProperties {
    /**
     * @description: 文件服务器地址
     */
    private String serverUrl;
    /**
     * @description: 文件服务器用户名
     */
    private String accessKey;
    /**
     * @description: 文件服务器密码
     */
    private String secretKey;
    /**
     * @description: 文件服务器 桶名
     */
    private String bucketName;
}

3. 业务上可以直接使用的bean对象

 
/**
 * @Description:
 * @Author: xxx
 * @CreateTime: 
 * @Description: 
 * @Version: 1.0
 */
@Component
public class MinIoUtils {
    private static final Logger logger = LoggerFactory.getLogger(MinIoUtils.class);
    @Resource
    private MinioClient client;

    private static final String SEPARATOR_DOT = ".";

    private static final String SEPARATOR_ACROSS = "-";

    private static final String SEPARATOR_STR = "";

    // 存储桶名称
    private static final String chunkBucKet = "img";

    /**
     * 不排序
     */
    public final static boolean NOT_SORT = false;

    /**
     * 排序
     */
    public final static boolean SORT = true;

    /**
     * 默认过期时间(分钟)
     */
    private final static Integer DEFAULT_EXPIRY = 60;

    /**
     * 删除分片
     */
    public final static boolean DELETE_CHUNK_OBJECT = true;
    /**
     * 不删除分片
     */
    public final static boolean NOT_DELETE_CHUNK_OBJECT = false;
    /**
     * @param multipartFiles
     * @param bucketName
     * @param directory image/
     * @return java.lang.String
     * @Description 文件上传
     * @author jack
     * @date 2022/08/04 13:45
     */
    public List<MinIoUploadResDTO> batchUpload(List<MultipartFile> multipartFiles, String bucketName, String directory) throws Exception {
        if (!this.bucketExists(bucketName)) {
            this.makeBucket(bucketName);
        }
        List<MinIoUploadResDTO> result = Lists.newArrayList();
        if(StringUtils.isNotBlank(directory)){
            directory = directory.replaceAll("/","");
        }
        directory = Optional.ofNullable(directory).orElse("")+"/"+ this.getFormatTime() +"/";
        for(MultipartFile multipartFile : multipartFiles) {
            InputStream inputStream = multipartFile.getInputStream();
            String minFileName = directory + minFileName(multipartFile.getOriginalFilename());
            //上传文件到指定目录
            client.putObject(PutObjectArgs.builder()
                    .bucket(bucketName)
                    .object(minFileName)
                    .contentType(multipartFile.getContentType())
                    .stream(inputStream, inputStream.available(), -1)
                    .build());
            inputStream.close();
            result.add(new MinIoUploadResDTO(minFileName, getObjectUrl(bucketName, minFileName, DEFAULT_EXPIRY),multipartFile.getOriginalFilename()));
        }
        // 返回生成文件名、访问路径
        return result;
    }

4. factories文件定义

注意这个 factories文件的命名,以及存储目录

文件名称是固定的: spring.factories

文件存储目录: resources/META-INF/ 目录下 

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.gfm.starter.config.MinioConfiguration

5. maven pom文件依赖管理

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
   
    <groupId>com.gfc.minio</groupId>
    <artifactId>spring-boot-starter-minio</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <name>spring-boot-starter-minio</name>
    <description>minio util starter project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
            <version>8.2.2</version>
            <!--maven引入minio排除okhttp依赖并添加高版本的okhttp依赖,如okhttp 4.9.0-->
            <exclusions>
                <exclusion>
                    <groupId>com.squareup.okhttp3</groupId>
                    <artifactId>okhttp</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>3.14.8</version>
        </dependency>
        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-client</artifactId>
            <version>2.1.4</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
       
</project>

6. 项目目录结构如下

注意这里的 factories 文件

文件名称是固定的: spring.factories

文件存储目录: resources/META-INF/ 目录下 

 7. 业务项目如何使用

由于上面的项目是一个SpringBoot Starter项目,所以启动的时候,会扫描 factories文件中定义的类,并实例化这个类。

所以其他的业务系统要使用这个Starter组件,只需要简单两步就可以了:

7.1: maven pom文件引入该Starter组件

  <dependency>
            <groupId>com.gfm.minio</groupId>
            <artifactId>spring-boot-starter-minio</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>

7.2: 业务代码注入相关的Bean对象

  @Resource
    private MinIoUtils minIoUtils;

这个MinIoUtils  类就是 上面 Starter组件中的类,在spring容器初始化启动的时候,这个类也完成了bean的实例化过程,所以容器中有这个bean对象,可以直接注入。

7.3: 业务代码使用 starter中的类方法

@Resource
private MinIoUtils  minIoUtils;

public void uploadFile(xxxx){
    minIoUtils.batchUpload(xxxx);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值