"\u003Cp\u003E点击上方“\u003Cstrong\u003Ejava进阶架构师\u003C\u002Fstrong\u003E”,选择右上角“\u003Cstrong\u003E置顶公众号\u003C\u002Fstrong\u003E”\u003C\u002Fp\u003E\u003Cp\u003E\u003Cstrong\u003E20\u003C\u002Fstrong\u003E\u003Cstrong\u003E大进阶架构专题每日送达\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cimg src=\"http:\u002F\u002Fp3.pstatp.com\u002Flarge\u002Fpgc-image\u002FRXhO6CTGvEtI3J\" img_width=\"1080\" img_height=\"720\" alt=\"Spring Boot中如何干掉过多的if else\" inline=\"0\"\u003E\u003Cp\u003E需求\u003C\u002Fp\u003E\u003Cp\u003E这里虚拟一个业务需求,让大家容易理解。假设有一个订单系统,里面的一个功能是根据订单的不同类型作出不同的处理。\u003C\u002Fp\u003E\u003Cp\u003E订单实体:\u003C\u002Fp\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fpgc-image\u002FRXhO6DGGaAYD7c\" img_width=\"318\" img_height=\"300\" alt=\"Spring Boot中如何干掉过多的if else\" inline=\"0\"\u003E\u003Cp\u003Eservice接口:\u003C\u002Fp\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fpgc-image\u002FRXhO6DTnYRHH\" img_width=\"359\" img_height=\"205\" alt=\"Spring Boot中如何干掉过多的if else\" inline=\"0\"\u003E\u003Cp\u003E传统实现\u003C\u002Fp\u003E\u003Cp\u003E根据订单类型写一堆的if else:\u003C\u002Fp\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fpgc-image\u002FRXhO6Dg3apBX47\" img_width=\"483\" img_height=\"272\" alt=\"Spring Boot中如何干掉过多的if else\" inline=\"0\"\u003E\u003Cp\u003E策略模式实现\u003C\u002Fp\u003E\u003Cp\u003E利用策略模式,只需要两行即可实现业务逻辑:\u003C\u002Fp\u003E\u003Cimg src=\"http:\u002F\u002Fp3.pstatp.com\u002Flarge\u002Fpgc-image\u002FRXhO6DvHaEVCdH\" img_width=\"640\" img_height=\"230\" alt=\"Spring Boot中如何干掉过多的if else\" inline=\"0\"\u003E\u003Cp\u003E可以看到上面的方法中注入了HandlerContext,这是一个处理器上下文,用来保存不同的业务处理器,具体在下文会讲解。我们从中获取一个抽象的处理器AbstractHandler,调用其方法实现业务逻辑。\u003C\u002Fp\u003E\u003Cp\u003E现在可以了解到,我们主要的业务逻辑是在处理器中实现的,因此有多少个订单类型,就对应有多少个处理器。以后需求变化,增加了订单类型,只需要添加相应的处理器就可以,上述OrderServiceV2Impl完全不需改动。\u003C\u002Fp\u003E\u003Cp\u003E我们先看看业务处理器的写法:\u003C\u002Fp\u003E\u003Cimg src=\"http:\u002F\u002Fp9.pstatp.com\u002Flarge\u002Fpgc-image\u002FRXhO6Ys9nmwauq\" img_width=\"459\" img_height=\"179\" alt=\"Spring Boot中如何干掉过多的if else\" inline=\"0\"\u003E\u003Cimg src=\"http:\u002F\u002Fp3.pstatp.com\u002Flarge\u002Fpgc-image\u002FRXhO6ZEEqlQZq5\" img_width=\"524\" img_height=\"201\" alt=\"Spring Boot中如何干掉过多的if else\" inline=\"0\"\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fpgc-image\u002FRXhO6ZUBh3DvbB\" img_width=\"499\" img_height=\"185\" alt=\"Spring Boot中如何干掉过多的if else\" inline=\"0\"\u003E\u003Cp\u003E首先每个处理器都必须添加到spring容器中,因此需要加上@Component注解,其次需要加上一个自定义注解@HandlerType,用于标识该处理器对应哪个订单类型,最后就是继承AbstractHandler,实现自己的业务逻辑。\u003C\u002Fp\u003E\u003Cp\u003E自定义注解 @HandlerType:\u003C\u002Fp\u003E\u003Cimg src=\"http:\u002F\u002Fp3.pstatp.com\u002Flarge\u002Fpgc-image\u002FRXhO6ZiCRPSVTG\" img_width=\"369\" img_height=\"166\" alt=\"Spring Boot中如何干掉过多的if else\" inline=\"0\"\u003E\u003Cp\u003E抽象处理器 AbstractHandler:\u003C\u002Fp\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fpgc-image\u002FRXhO6Zx2WpmlvH\" img_width=\"425\" img_height=\"75\" alt=\"Spring Boot中如何干掉过多的if else\" inline=\"0\"\u003E\u003Cp\u003E自定义注解和抽象处理器都很简单,那么如何将处理器注册到spring容器中呢?\u003C\u002Fp\u003E\u003Cp\u003E具体思路是:\u003C\u002Fp\u003E\u003Cp\u003E1、扫描指定包中标有@HandlerType的类;\u003C\u002Fp\u003E\u003Cp\u003E2、将注解中的类型值作为key,对应的类作为value,保存在Map中;\u003C\u002Fp\u003E\u003Cp\u003E3、以上面的map作为构造函数参数,初始化HandlerContext,将其注册到spring容器中;\u003C\u002Fp\u003E\u003Cp\u003E我们将核心的功能封装在HandlerProcessor类中,完成上面的功能。\u003C\u002Fp\u003E\u003Cp\u003EHandlerProcessor:\u003C\u002Fp\u003E\u003Cimg src=\"http:\u002F\u002Fp3.pstatp.com\u002Flarge\u002Fpgc-image\u002FRXhO6tu9ASaYKv\" img_width=\"640\" img_height=\"342\" alt=\"Spring Boot中如何干掉过多的if else\" inline=\"0\"\u003E\u003Cp\u003EClassScaner:\u003C\u002Fp\u003E\u003Cimg src=\"http:\u002F\u002Fp3.pstatp.com\u002Flarge\u002Fpgc-image\u002FRXhO6uc5BngIGE\" img_width=\"997\" img_height=\"3203\" alt=\"Spring Boot中如何干掉过多的if else\" inline=\"0\"\u003E\u003Cp\u003EClassScaner:扫描工具类源码\u003C\u002Fp\u003E\u003Cp\u003EHandlerProcessor需要实现BeanFactoryPostProcessor,在spring处理bean前,将自定义的bean注册到容器中。\u003C\u002Fp\u003E\u003Cp\u003E核心工作已经完成,现在看看HandlerContext如何获取对应的处理器:\u003C\u002Fp\u003E\u003Cp\u003EHandlerContext:\u003C\u002Fp\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fpgc-image\u002FRXhO6vKXcY8Ms\" img_width=\"640\" img_height=\"264\" alt=\"Spring Boot中如何干掉过多的if else\" inline=\"0\"\u003E\u003Cp\u003EBeanTool:获取bean工具类\u003C\u002Fp\u003E\u003Cimg src=\"http:\u002F\u002Fp3.pstatp.com\u002Flarge\u002Fpgc-image\u002FRXhO6vbIwYllLB\" img_width=\"736\" img_height=\"818\" alt=\"Spring Boot中如何干掉过多的if else\" inline=\"0\"\u003E\u003Cp\u003E#getInstance方法根据类型获取对应的class,然后根据class类型获取注册到spring中的bean。\u003C\u002Fp\u003E\u003Cp\u003E最后请注意一点,HandlerProcessor和BeanTool必须能被扫描到,或者通过@Bean的方式显式的注册,才能在项目启动时发挥作用。\u003C\u002Fp\u003E\u003Cp\u003E总结\u003C\u002Fp\u003E\u003Cp\u003E利用策略模式可以简化繁杂的if else代码,方便维护,而利用自定义注解和自注册的方式,可以方便应对需求的变更。本文只是提供一个大致的思路,还有很多细节可以灵活变化,例如使用枚举类型、或者静态常量,作为订单的类型,相信你能想到更多更好的方法。\u003C\u002Fp\u003E\u003Cp\u003E最后,完整的代码如下:\u003C\u002Fp\u003E\u003Cp\u003Ehttps:\u002F\u002Fgithub\u003Ci class=\"chrome-extension-mutihighlight chrome-extension-mutihighlight-style-1\"\u003E.com\u003C\u002Fi\u003E\u002Fciphermagic\u002Fjava-learn\u002Ftree\u002Fmaster\u002Fsandbox\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fcipher\u002Fhandler_demo\u003C\u002Fp\u003E\u003Cp\u003E\u003Cstrong\u003E原文链接:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003Ehttps:\u002F\u002Fm.toutiaocdn.cn\u002Fi66539876749462\u003Ci class=\"chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2\"\u003E73\u003C\u002Fi\u003E803\u003C\u002Fp\u003E\u003Cp\u003E———— e n d ————\u003C\u002Fp\u003E\u003Cp\u003E本期专题推荐\u003C\u002Fp\u003E\u003Cp\u003E手\u003C\u002Fp\u003E\u003Cp\u003E专\u003C\u002Fp\u003E\u003Cp\u003E题\u003C\u002Fp\u003E\u003Cp\u003E写\u003C\u002Fp\u003E\u003Cp\u003E\u003Cstrong\u003E【手写专题】师长说:\u003C\u002Fstrong\u003E想要进阶架构师,不仅仅只是懂得框架原理。下面,就让师长\u003Cstrong\u003E手把手\u003C\u002Fstrong\u003E带你手写\u003Cstrong\u003ESpring MVC、Spring、Mybatis、秒杀架构、RPC等框架\u003C\u002Fstrong\u003E,让你提升架构思维,真正吃透!\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003Cp\u003E\u003Cstrong\u003E其余的微服务、分布式、高并发、JVM调优等\u003C\u002Fstrong\u003E\u003Cstrong\u003E20\u003C\u002Fstrong\u003E\u003Cstrong\u003E大进阶架构师专题请\u003C\u002Fstrong\u003E\u003Cstrong\u003E\u003Ci class=\"chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2\"\u003E关注\u003C\u002Fi\u003E\u003C\u002Fstrong\u003E\u003Cstrong\u003E公众号\u003C\u002Fstrong\u003E\u003Cstrong\u003E【\u003C\u002Fstrong\u003E\u003Cstrong\u003EJava进阶架构师\u003C\u002Fstrong\u003E\u003Cstrong\u003E】\u003C\u002Fstrong\u003E\u003Cstrong\u003E后在\u003C\u002Fstrong\u003E\u003Cstrong\u003E菜单栏\u003C\u002Fstrong\u003E\u003Cstrong\u003E查看\u003C\u002Fstrong\u003E\u003Cstrong\u003E。\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cstrong\u003E看到这里,说明你喜欢本文\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E"'.slice(6, -6), groupId: '6719389910249243150
相关文章