SpringBoot的条件加载

#todo/note

Service具备多个实现类,具体加载哪一个类实例并放入SpringBoot的BeanFactory是根据配置文件中写的值与实现类上的条件加载注解配合来决定
像项目或者框架中对于同一类型的工作配置了多种实现方式时,这就是一种很好的解决手段,比如登录、注册、上传等。这其实算不上某种设计模式,类似策略但不是策略,因为策略模式定义一系列算法,并将每个算法封装在独立的类中,使得它们可以互相替换。在运行时,可以根据不同的情况选择不同的算法,从而改变对象的行为。但很显然这个场景下配置是写死的,只是方便切换,并没有做到在运行时的动态选择

/**  
 * 对象存储服务接口层  
 *  
 * @author haoxr  
 * @since 2022/11/19  
 */public interface OssService {  
  
    /**  
     * 上传文件  
     * @param file 表单文件对象  
     * @return 文件信息  
     */  
    FileInfo uploadFile(MultipartFile file);  
  
    /**  
     * 删除文件  
     *  
     * @param filePath 文件完整URL  
     * @return 删除结果  
     */  
    boolean deleteFile(String filePath);  
  
  
}

/**
 * MinIO 文件上传服务类
 *
 * @author haoxr
 * @since 2023/6/2
 */
@Component
@ConditionalOnProperty(value = "oss.type", havingValue = "minio")
@ConfigurationProperties(prefix = "oss.minio")
@RequiredArgsConstructor
@Data
public class MinioOssService implements OssService

/**  
 * Aliyun 对象存储服务类  
 *  
 * @author haoxr  
 * @since 2.3.0  
 */@Component  
@ConditionalOnProperty(value = "oss.type", havingValue = "aliyun")  
@ConfigurationProperties(prefix = "oss.aliyun")  
@RequiredArgsConstructor  
@Data  
public class AliyunOssService implements OssService

基于SpringBoot的解耦策略

传统的策略模式实现虽然实现了策略的核心,但却并没有完全解耦
而借助SpringBoot,我们可以实现完全解耦优化策略实现