场景:
一个图片存储系统,有不同的存储方式:本地、minio服务器
创建文件接口 FileStorage,存储类型的enum也选择写在内部:
public interface FileStorage {
String getId();
String upload(String sealId,String base64Data);
enum FileEnum{
LOCAL("LOCAL"),
MINIO("MINIO");
private String mode;
public String getMode() {
return mode;
}
FileEnum(String mode) {
this.mode = mode;
}
}
}
两个实现类的属性类,LocalFileProperties和MinioProperties,添加@ConfigurationProperties注解直接读取配置文件中的值,当然可以用Data省略代码:
公共属性类:
public class FileStorageProperties {
/**
* 用于区分多种存储方式,在yml配置当前所需
*/
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
@ConfigurationProperties("file.local")
public class LocalProperties extends FileStorageProperties {
private String dir;
public String getDir() {
return dir;
}
public void setDir(String dir) {
this.dir = dir;
}
}
@ConfigurationProperties("file.minio")
public class MinioProperties extends FileStorageProperties {
/**
* accessKey
*/
private String accessKey;
/**
* secretKey
*/
private String secretKey;
/**
* 存储空间名称
*/
private String bucket;
/**
* 地址
*/
private String url;
@Override
public String toString() {
return "MinIOProperties{" +
"accessKey='" + accessKey + '\'' +
", secretKey='" + secretKey + '\'' +
", bucket='" + bucket + '\'' +
", url='" + url + '\'' +
"} " + super.toString();
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getAccessKey() {
return accessKey;
}
public void setAccessKey(String accessKey) {
this.accessKey = accessKey;
}
public String getSecretKey() {
return secretKey;
}
public void setSecretKey(String secretKey) {
this.secretKey = secretKey;
}
public String getBucket() {
return bucket;
}
public void setBucket(String bucket) {
this.bucket = bucket;
}
}
实现类:
@Slf4j
public class LocalFileStorage implements FileStorage {
private LocalProperties properties;
public LocalFileStorage(LocalProperties properties) {
this.properties = properties;
}
@Override
public String getId() {
return properties.getId();
}
@Override
public String upload(String sealId, String base64Data) {
******
return ******;
}
}
@Slf4j
public class MinioFileStorage implements FileStorage {
private MinioClient client;
private MinioProperties properties;
public MinioFileStorage(MinioProperties properties) {
this.properties = properties;
client = MinioClient.builder().
endpoint(properties.getUrl())
.credentials(properties.getAccessKey(), properties.getSecretKey())
.build();
}
@Override
public String upload(String sealId,String base64Data) {
******
return ***;
}
@Override
public String getId() {
return properties.getId();
}
}
自动加载装配:
@EnableConfigurationProperties(LocalProperties.class)
@Configuration
@ConfigurationProperties("file.local.id")
@Slf4j
public class LocalAutoConfiguration {
@Bean
public FileStorage localFileStorage(LocalProperties properties) {
return new LocalFileStorage(properties);
}
}
@EnableConfigurationProperties(MinioProperties.class)
@Configuration
@ConfigurationProperties("file.minio.id")
@Slf4j
public class MinioAutoConfiguration {
@Bean
public FileStorage minioFileStorage(MinioProperties properties) {
return new MinioFileStorage(properties);
}
}
最后是service,将实现类放在storages集合中,用stream.filter()方法筛选ID与当前存储方式相同的实现类:
@Service
@Slf4j
public class FileStorageService {
@Autowired
private List<FileStorage> storages;
public Optional<FileStorage> find(FileStorage.FileEnum mode) {
FileStorage.FileEnum currentMode = mode;
return storages.stream().filter(fileStorage -> currentMode.getMode().equals(fileStorage.getId())).findFirst();
}
}
最后调用的时候:
FileStorage fileStorage = storageService.find(FileStorage.FileEnum.valueOf(mode)).orElse(null);
将当前存储模式的mode与存储类的ID对比,选取对应的实现类。
知识不足,描述的太差了,等以后再来调整补全(๑•́ωก̀๑) ,大神们看一眼就懂了,这里记录一下写法免得忘记了。
该博客介绍了如何使用Java的Spring Boot框架实现文件存储的策略模式,包括定义FileStorage接口,枚举FileEnum表示存储类型,以及LocalFileStorage和MinioFileStorage的实现。通过@ConfigurationProperties注解从配置文件读取属性,并使用@EnableConfigurationProperties进行自动装配。服务层通过stream.filter()方法根据存储方式选择对应的实现类。
9860

被折叠的 条评论
为什么被折叠?



