SpringBoot的条件加载
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,我们可以实现完全解耦优化策略实现