- 声明接口
// ApiResult 就是返回值,可以根据自己的需求,定义
/**
- 根据不同的处理类型,来选择不同的处理方案
- @author erjun
-
*/
public interface StorageType {
ApiResult handleStorage();
}
- 定义两个实现类
@Service("hdfsStorageType")
public class HdfsStorageType implements StorageType {
@Override
public ApiResult handleStorage() {
System.out.println("-----hdfs---storageType-----");
return null;
}
}
@Service("ftpStorageType")
public class FtpStorageType implements StorageType {
@Override
public ApiResult handleStorage() {
System.out.println("-----ftp---storageType-----");
return null;
}
}
- 定义一个Register类
将多个子类,注册到一个map容器里
@Service("register")
public class Register implements InitializingBean, ApplicationContextAware {
private Map<String, StorageType> serviceImpMap = new HashMap<String, StorageType>();
private ApplicationContext applicationContext;
// 获取Spring的上下文
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
// 注册接口StorageType的所有实现的bean,
// 可以按照自己的规则放入 注册中心 serviceImpMap里
@Override
public void afterPropertiesSet() throws Exception {
Map<String, StorageType> beanMap = applicationContext.getBeansOfType(StorageType.class);
String name = null;
for (StorageType storageType : beanMap.values()) {
name = storageType.getClass().getSimpleName();
System.out.println("---key:\t" + name);
// 将类名,作为 key,
serviceImpMap.put(name, storageType);
}
}
public StorageType getStorageType(String name) {
return serviceImpMap.get(name);
}
}
- controller层进行调用
- POST 测试:
结果: