【Java SpringBoot Starter】开发一个自己的SpringBoot Starter组件,应该怎么写,需要什么配置
目录
1. 自定义的Starter,需要的Configuration 类
2. .properties文件的配置,或者yml文件的配置内容,注入bean对象中
3. 业务上可以直接使用的bean对象
4. factories文件
5. maven pom文件内容
6. 项目目录结构如下
7. 业务项目如何使用
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();
}
}
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;
}
/**
* @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;
}
注意这个 factories文件的命名,以及存储目录
文件名称是固定的: spring.factories
文件存储目录: resources/META-INF/ 目录下
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.gfm.starter.config.MinioConfiguration
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
注意这里的 factories 文件
文件名称是固定的: spring.factories
文件存储目录: resources/META-INF/ 目录下
由于上面的项目是一个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对象,可以直接注入。