记录一次实现接口多实现类的选择调用

该博客介绍了如何使用Java的Spring Boot框架实现文件存储的策略模式,包括定义FileStorage接口,枚举FileEnum表示存储类型,以及LocalFileStorage和MinioFileStorage的实现。通过@ConfigurationProperties注解从配置文件读取属性,并使用@EnableConfigurationProperties进行自动装配。服务层通过stream.filter()方法根据存储方式选择对应的实现类。

场景:

        一个图片存储系统,有不同的存储方式:本地、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 ******;
    }
}
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==
@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();
    }

    
}
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

自动加载装配:

@EnableConfigurationProperties(LocalProperties.class)
@Configuration
@ConfigurationProperties("file.local.id")
@Slf4j
public class LocalAutoConfiguration {


    @Bean
    public FileStorage localFileStorage(LocalProperties properties) {
        return new LocalFileStorage(properties);
    }
}
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==
@EnableConfigurationProperties(MinioProperties.class)
@Configuration
@ConfigurationProperties("file.minio.id")
@Slf4j
public class MinioAutoConfiguration {

    @Bean
    public FileStorage minioFileStorage(MinioProperties properties) {
        return new MinioFileStorage(properties);
    }
}
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

最后是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();
    }

}
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 最后调用的时候:

FileStorage fileStorage = storageService.find(FileStorage.FileEnum.valueOf(mode)).orElse(null);
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

将当前存储模式的mode与存储类的ID对比,选取对应的实现类。


知识不足,描述的太差了,等以后再来调整补全(๑•́ωก̀๑) ,大神们看一眼就懂了,这里记录一下写法免得忘记了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值