前言
最近在开发一个在线网盘的功能, 支持多个存储策略. 启动时, 读取数据库, 获取当前启用的存储类型, 然后项目启动后, 还可以动态切换存储类型.
由于是基于 Spring 开发的, 所以一般是这么写的:
接口:
1 | public interface FileService { |
阿里云实现类:
1 |
|
腾讯云实现类:
1 |
|
然后在 Controller 层注入:
1 |
|
但, 这样肯定会出错的, 因为 FileService
接口, 有两个实现类, 都标注了 @Service
, 注入时, Spring 不知道到底注入哪个.
这办法不可行, 即使指定了注入哪个, 也没办法实现动态切换注入的类.
实现
那么换个思路, 不使用 @Resource
注入, 而是在项目启动完后, 获取 FileService
类型的所有类, 然后从数据库获取当前启用的存储类型, set 到 Controller
的 fileService
属性中. 具体看代码吧:
两个 Service
类的代码不变, 新增获取存储类型的工厂类:
1 |
|
1 |
|
大概就是这样, 主要就是不直接使用 @Resouce
注入, 而是在启动时, 先获取所有的 Service
, 存储到 Map 中, 提供静态方法, 然后利用 @PostConstruct
启动时自动调用初始化方法, 动态注入 fileService
.