记录一次在处理业务过程中遇到的问题,
背景是这样子,有一天boss过来找我说,小王呀,公司现在有一个只有一个支付宝的支付功能,为了拓展业务,所以又打算接入一个微信的支付功能,现在要求这两个功能同时上线运行,然后又随机分配,如果其中一个出了问题可以马上切换到另一个顶上去!
然后boss说完需求就自顾自的去忙了,留下一脸懵逼的我!!
不管怎么样,需求提出来了,功能还是要做的。
思前想后,想出了一个解决思路,可以利用多态的思想,建立一个基类/接口,上代码
public interface BaseData {
public String getName();
}
然后其下面有两个子类
@Component("DataOne")
public class DataOne implements BaseData {
public String getName(){
return "DataOne";
}
}
@Component("DataTwo")
public class DataTwo implements BaseData {
public String getName(){
return "DataTwo";
}
}
最后再创建一个代理类
@Component
public class PoxyData {
Random random = new Random();
@Autowired
@Qualifier("DataOne")
BaseData DataOne;
@Autowired
@Qualifier("DataTwo")
BaseData DataTwo;
public BaseData getData(){
List<BaseData> baseDataList = new ArrayList<>();
baseDataList.add(DataOne);
baseDataList.add(DataTwo);
int index = random.nextInt(2);
return baseDataList.get(index);
}
}
最后是调用
@RestController
public class TestController {
@Autowired
PoxyData poxyData;
@GetMapping("/test1")
public String testClient1() {
return poxyData.getData().getName();
}
}
最后看一下运行结果
这里可以看到大概的功能已经实现了
通过一个代理类去封装里面业务实现的细节的,然后对外只暴露一代理类,跟据需求去里面取对应的实现类就行了。
然后你以为这样子就可以吗?图样图森破,细心的同学可能已经发现了
没错,就是他,这是不是意味着,如果有多个业务的话,就要写多个属性??这对于这么懒的小编来说,是不可以接受的
于是,屁颠屁颠的跑去跟小组长求救,于是乎有了改良版
@Component
public class PoxyData implements BeanPostProcessor {
Random random = new Random();
List<BaseData> baseDataList = new ArrayList<>();
// @Autowired
// @Qualifier("DataOne")
// BaseData DataOne;
//
// @Autowired
// @Qualifier("DataTwo")
// BaseData DataTwo;
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof BaseData) {
baseDataList.add((BaseData) bean);
}
return bean;
}
public BaseData getData(){
int index = random.nextInt(2);
return baseDataList.get(index);
}
}
通过继承BeanPostProcessor ,然后他的 postProcessAfterInitialization方法里面把BaseData的子类全部放到集合中,
对于BeanPostProcessor不了解的同学,可以点这里去了解一下
就此,可以实现boss提出的功能啦!想想还是蛮开心的啦