2019.08.15日记,记录一次多个业务并行运行的思路

记录一次在处理业务过程中遇到的问题,

背景是这样子,有一天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提出的功能啦!想想还是蛮开心的啦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值