前言
学习内容:
- 学会如何将独立模块封装为springboot-starter并引入使用
提示:以下是本篇文章正文内容,下面案例可供参考
例子使用阿里云OSS
一、创建模块
创建要封装成springboot-start的代码和配置
- 创建自定义OSS接口
package com.mk.file.service;
import java.io.InputStream;
/**
* @author mk
*/
public interface FileStorageService {
public String upload(InputStream inputStream, String module, String fileName);
}
- 实现OSS接口
@EnableConfigurationProperties(OssConfigProperties.class)注解是开启OssConfigProperties.class这个类的配置扫描属性
@Import(OssConfig.class)这个注解是将OssConfig这个类注入到Spring中
package com.mk.file.service.impl;
import com.aliyun.oss.OSS;
import com.aliyun.oss.model.CannedAccessControlList;
import com.mk.file.config.OssConfig;
import com.mk.file.config.OssConfigProperties;
import com.mk.file.service.FileStorageService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Import;
import java.io.InputStream;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.UUID;
@Slf4j
@EnableConfigurationProperties(OssConfigProperties.class)
@Import(OssConfig.class)
public class OssFileStorageService implements FileStorageService {
@Autowired
private OSS ossClient;
@Autowired
private OssConfigProperties ossConfig;
@Override
public String upload(InputStream inputStream, String module, String fileName) {
System.out.println("module是===>"+module);
System.out.println("fileName是===>"+fileName);
System.out.println(ossConfig);
if(!ossClient.doesBucketExist(ossConfig.getBucketname())){
//创建bucket
ossClient.createBucket(ossConfig.getBucketname());
//设置oss实例的访问权限:公共读
ossClient.setBucketAcl(ossConfig.getBucketname(), CannedAccessControlList.PublicRead);
}
//构建日期路径
String folder = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
//文件名:uuid.扩展名
fileName = UUID.randomUUID().toString() + fileName.substring(fileName.lastIndexOf("."));
//文件根路径
String key = module + "/" + folder + "/" + fileName;
System.out.println("文件路径===>"+key);
//文件上传至阿里云
ossClient.putObject(ossConfig.getBucketname(), key, inputStream);
// 关闭OSSClient。
ossClient.shutdown();
//阿里云文件绝对路径
return "https://" + ossConfig.getBucketname() + "." + ossConfig.getEndpoint() + "/" + key;
}
}
- OssConfigProperties扫描配置文件,启动步骤2会开启步骤3的配置扫描
package com.mk.file.config;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.io.Serializable;
@Data
@ConfigurationProperties(prefix = "aliyun.oss") // 文件上传配置
public class OssConfigProperties implements Serializable {
private String endpoint;
private String accesskey;
private String secretkey;
private String bucketname;
}
- OssConfig配置类
@Data
@Configuration
@ConditionalOnClass(FileStorageService.class)//当有了这个类FileStorageService类后OssConfig才会生效
public class OssConfig {
@Autowired
private OssConfigProperties ossConfigProperties;
//创建阿里云OSS客户端
@Bean
public OSS buildOssClient() {
return new OSSClientBuilder().build(ossConfigProperties.getEndpoint(),ossConfigProperties.getAccesskey(),ossConfigProperties.getSecretkey());
}
}
- 在resources文件下创建META-INF文件夹,并在META-INF文件夹中创建spring.factories文件
创建这个文件的作用就是当我们其他模块引入当前这个start模块后会自动注入com.mk.file.service.impl.OssFileStorageService就可以直接使用了
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.mk.file.service.impl.OssFileStorageService
- 在pom文件中声明artifactId,这样其他模块就可以通过这个oss-file-starter导入我们上面自定义的start模块了
<artifactId>oss-file-starter</artifactId>
二、测试
- 导入自定义OSS的start模块
代码如下(示例):
<!--导入自定义的minio starter-->
<dependencies>
<dependency>
<groupId>com.mk</groupId>
<artifactId>oss-file-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
- 在application.yml配置文件中写入 阿里云的配置属性,这里要和步骤3中的配置前缀和属性名保持一致
aliyun:
oss:
endpoint: Endpoint(地域节点)的外网节点
accesskey: 阿里云用户密钥
secretkey: 阿里云密码密钥
bucketname: oss的桶名称
- 测试
@SpringBootTest(classes = OssApp.class)
@RunWith(SpringRunner.class)
public class MinioStarterTest {
@Autowired
FileStorageService fileStorageService;
@Test
public void test() throws FileNotFoundException {
InputStream stream = new FileInputStream("上传文件的路径");
String uploadUrl = fileStorageService.upload(stream, 模块名, 传输文件名);
}
}