需求spring
这里虚拟一个业务需求,让你们容易理解。假设有一个订单系统,里面的一个功能是根据订单的不一样类型做出不一样的处理。架构
若是想学习Java工程化、高性能及分布式、深刻浅出。微服务、Spring,MyBatis,Netty源码分析的朋友能够加个人Java高级交流:787707172,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给你们。分布式
订单实体:函数
service接口:微服务
传统实现工具
根据订单类型写一堆的if else:源码分析
策略模式实现性能
利用策略模式,只须要两行便可实现业务逻辑:学习
能够看到上面的方法中注入了HandlerContext,这是一个处理器上下文,用来保存不一样的业务处理器,具体在下文会讲解。咱们从中获取一个抽象的处理器AbstractHandler,调用其方法实现业务逻辑。3d
如今能够了解到,咱们主要的业务逻辑是在处理器中实现的,所以有多少个订单类型,就对应有多少个处理器。之后需求变化,增长了订单类型,只须要添加相应的处理器就能够,上述OrderServiceV2Impl彻底不需改动。
咱们先看看业务处理器的写法:
首先每一个处理器都必须添加到spring容器中,所以须要加上@Component注解,其次须要加上一个自定义注解@HandlerType,用于标识该处理器对应哪一个订单类型,最后就是继承AbstractHandler,实现本身的业务逻辑。
自定义注解 @HandlerType:
抽象处理器 AbstractHandler:
自定义注解和抽象处理器都很简单,那么如何将处理器注册到spring容器中呢?
具体思路是:
一、扫描指定包中标有@HandlerType的类;
二、将注解中的类型值做为key,对应的类做为value,保存在Map中;
三、以上面的map做为构造函数参数,初始化HandlerContext,将其注册到spring容器中;
咱们将核心的功能封装在HandlerProcessor类中,完成上面的功能。
HandlerProcessor:
ClassScaner:扫描工具类源码
HandlerProcessor须要实现BeanFactoryPostProcessor,在spring处理bean前,将自定义的bean注册到容器中。
核心工做已经完成,如今看看HandlerContext如何获取对应的处理器:
HandlerContext:
BeanTool:获取bean工具类
#getInstance方法根据类型获取对应的class,而后根据class类型获取注册到spring中的bean。
最后请注意一点,HandlerProcessor和BeanTool必须能被扫描到,或者经过@Bean的方式显式的注册,才能在项目启动时发挥做用。
总结
利用策略模式能够简化繁杂的if else代码,方便维护,而利用自定义注解和自注册的方式,能够方便应对需求的变动。本文只是提供一个大体的思路,还有不少细节能够灵活变化,例如使用枚举类型、或者静态常量,做为订单的类型,相信你能想到更多更好的方法。
欢迎工做一到八年的Java工程师朋友们加入Java高级交流:787707172
本群提供免费的学习指导 架构资料 以及免费的解答
不懂得问题均可以在本群提出来 以后还会有直播平台和讲师直接交流噢