当前位置: 首页 > 科技观察

如何在SpringBoot中摆脱太多ifelse!

时间:2023-03-16 00:09:39 科技观察

需求这里是一个虚拟的业务需求,方便大家看懂。假设有一个订单系统,其中的一个功能就是根据不同类型的订单进行不同的处理。订单实体:服务接口:传统实现根据订单类型写一堆ifelse:策略模式实现使用策略模式,实现业务逻辑只需要两行:可以看到上面的方法注入了HandlerContext,这是一个processing服务器上下文用于保存不同的业务处理器,下面会详细说明。我们从中得到一个抽象处理器AbstractHandler,调用它的方法实现业务逻辑。现在我们可以明白,我们的主要业务逻辑是在处理器中实现的,所以有多少处理器就有多少订单类型。以后如果需求发生变化,增加了订单类型,只需要增加相应的处理器即可。上面提到的OrderServiceV2Impl根本不需要改动。我们先看业务处理器的写法:首先,每个处理器都要添加到spring容器中,所以需要添加@Component注解,其次需要添加自定义注解@HandlerType来标识是哪个处理器对应Order类型,最好是继承AbstractHandler实现自己的业务逻辑。自定义注解@HandlerType:abstractprocessorAbstractHandler:自定义注解和抽象处理器很简单,那么如何在spring容器中注册处理器呢?具体思路是:1.扫描指定包中标记为@HandlerType的类;2、以注解中的type值作为key,对应的class作为value,保存在Map中;3、使用上面的map作为构造函数参数,初始化HandlerContext,注册到spring容器中;我们将核心功能封装在HandlerProcessor类中,完成以上功能。HandlerProcessor:ClassScaner:ClassScaner:扫描工具类源码HandlerProcessor需要实现BeanFactoryPostProcessor,在spring处理bean之前将自定义的bean注册到容器中。核心工作已经完成,现在我们看看HandlerContext如何获取对应的processor:HandlerContext:BeanTool:获取bean工具类#getInstance方法根据类型获取对应的类,然后根据类类型获取在spring中注册的bean.***请注意HandlerProcessor和BeanTool必须通过@Bean扫描或显式注册才能在项目启动时发挥作用。总结使用策略模式可以简化复杂的ifelse代码,方便维护,使用自定义注解和自注册的方式可以轻松应对需求的变化。本文只提供了一个大概的思路,还有很多细节可以灵活更改,比如使用枚举类型或者静态常量作为命令的类型。相信你能想出更多更好的方法。