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

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

目录

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

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

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

4. factories文件

5. maven pom文件内容

6. 项目目录结构如下

 7. 业务项目如何使用


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 batchUpload(List multipartFiles, String bucketName, String directory) throws Exception {
        if (!this.bucketExists(bucketName)) {
            this.makeBucket(bucketName);
        }
        List 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文件依赖管理



    4.0.0
   
    com.gfc.minio
    spring-boot-starter-minio
    1.0.0-SNAPSHOT
    spring-boot-starter-minio
    minio util starter project for Spring Boot

    
        1.8
    

    
        
            org.springframework.boot
            spring-boot-starter
        
        
            org.springframework.boot
            spring-boot-configuration-processor
            true
        
        
            org.projectlombok
            lombok
            true
        
        
            io.minio
            minio
            8.2.2
            
            
                
                    com.squareup.okhttp3
                    okhttp
                
            
        
        
            com.squareup.okhttp3
            okhttp
            3.14.8
        
        
            de.codecentric
            spring-boot-admin-starter-client
            2.1.4
        
        
            org.springframework.boot
            spring-boot-starter-web
        
    
       

6. 项目目录结构如下

注意这里的 factories 文件

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

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

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

 

 7. 业务项目如何使用

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

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

 

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

  
            com.gfm.minio
            spring-boot-starter-minio
            1.0.0-SNAPSHOT
        

 

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

  @Resource
    private MinIoUtils minIoUtils;

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

你可能感兴趣的:(java编程,spring,java,spring,boot,spring)