1. 首页
  2. IT资讯

在 Spring Boot 中,如何干掉 if else

“u003Cpu003EJava后端,选择“”u003Cu002Fpu003Eu003Cpu003E优质文章,及时送达u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRcsUnd92eoboDR” img_width=”640″ img_height=”29″ alt=”在 Spring Boot 中,如何干掉 if else” inline=”0″u003Eu003Cpu003E来自 | 掘金(作者:cipher)u003Cu002Fpu003Eu003Cpu003E原文 | juejin.imu002Fpostu002F5c551122e51d457fcc5a9790u003Cu002Fpu003Eu003Cpu003E推荐 | Java 8 的这个特性,用起来真的很爽(点击查看)u003Cu002Fpu003Eu003Cpu003Eu003Cstrong toutiao-origin=”span”u003E需求u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E这里虚拟一个业务需求,让大家容易理解。假设有一个订单系统,里面的一个功能是根据订单的不同类型作出不同的处理。u003Cu002Fpu003Eu003Cpu003E订单实体:u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp9.pstatp.comu002Flargeu002Fpgc-imageu002FRdLgGrgG2PEYNo” img_width=”494″ img_height=”730″ alt=”在 Spring Boot 中,如何干掉 if else” inline=”0″u003Eu003Cpu003Eservice接口:u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRdLgGs22d4f8gR” img_width=”528″ img_height=”492″ alt=”在 Spring Boot 中,如何干掉 if else” inline=”0″u003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h1″u003E传统实现u003Cu002Fh1u003Eu003Cpu003E根据订单类型写一堆的if else:u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRdLgGsQ5rNpyrt” img_width=”832″ img_height=”684″ alt=”在 Spring Boot 中,如何干掉 if else” inline=”0″u003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h1″u003E策略模式实现u003Cu002Fh1u003Eu003Cpu003E利用策略模式,只需要两行即可实现业务逻辑:u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRdLgGspEPgS1Lu” img_width=”1080″ img_height=”511″ alt=”在 Spring Boot 中,如何干掉 if else” inline=”0″u003Eu003Cpu003E可以看到上面的方法中注入了HandlerContext,这是一个处理器上下文,用来保存不同的业务处理器,具体在下文会讲解。我们从中获取一个抽象的处理器AbstractHandler,调用其方法实现业务逻辑。u003Cu002Fpu003Eu003Cpu003E现在可以了解到,我们主要的业务逻辑是在处理器中实现的,因此有多少个订单类型,就对应有多少个处理器。以后需求变化,增加了订单类型,只需要添加相应的处理器就可以,上述OrderServiceV2Impl完全不需改动。u003Cu002Fpu003Eu003Cpu003E我们先看看业务处理器的写法:u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRdLgGtI4YetXe9″ img_width=”812″ img_height=”430″ alt=”在 Spring Boot 中,如何干掉 if else” inline=”0″u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRdLgIfkATnyLWA” img_width=”810″ img_height=”420″ alt=”在 Spring Boot 中,如何干掉 if else” inline=”0″u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRdLgIgD6tJc8hB” img_width=”872″ img_height=”440″ alt=”在 Spring Boot 中,如何干掉 if else” inline=”0″u003Eu003Cpu003E首先每个处理器都必须添加到spring容器中,因此需要u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-5″u003E加上u003Cu002Fiu003E@Component注解,其次需要u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-5″u003E加上u003Cu002Fiu003E一个自定义注解@HandlerType,用于标识该处理器对应哪个订单类型,最后就是继承AbstractHandler,实现自己的业务逻辑。u003Cu002Fpu003Eu003Cpu003E自定义注解 @HandlerType:u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FRdLgIgV3JGx8q9″ img_width=”734″ img_height=”394″ alt=”在 Spring Boot 中,如何干掉 if else” inline=”0″u003Eu003Cpu003E抽象处理器 AbstractHandler:u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FRdLgIgpATvyY9Q” img_width=”768″ img_height=”156″ alt=”在 Spring Boot 中,如何干掉 if else” inline=”0″u003Eu003Cpu003E自定义注解和抽象处理器都很简单,那么如何将处理器注册到spring容器中呢?u003Cu002Fpu003Eu003Cpu003E具体思路是:u003Cu002Fpu003Eu003Cpu003E1、扫描指定包中标有@HandlerType的类;u003Cu002Fpu003Eu003Cpu003E2、将注解中的类型值作为key,对应的类作为value,保存在Map中;u003Cu002Fpu003Eu003Cpu003E3、以上面的map作为构造函数参数,初始化HandlerContext,将其注册到spring容器中;u003Cu002Fpu003Eu003Cpu003E我们将核心的功能封装在HandlerProcessor类中,完成上面的功能。u003Cu002Fpu003Eu003Cpu003EHandlerProcessor:u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRdLgIh37tvY4tR” img_width=”1080″ img_height=”980″ alt=”在 Spring Boot 中,如何干掉 if else” inline=”0″u003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h1″u003EClassScanner:扫描工具类源码u003Cu002Fh1u003Eu003Cpu003EHandlerProcessor需要实现BeanFactoryPostProcessor,在spring处理bean前,将自定义的bean注册到容器中。u003Cu002Fpu003Eu003Cpu003E核心工作已经完成,现在看看HandlerContext如何获取对应的处理器:u003Cu002Fpu003Eu003Cpu003EHandlerContext:u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FRdLgJ5yImNYhBV” img_width=”1080″ img_height=”609″ alt=”在 Spring Boot 中,如何干掉 if else” inline=”0″u003Eu003Cpu003EBeanTool:获取bean工具类u003Cu002Fpu003Eu003Cpu003Eu003Ccodeu003E#getInstanceu003Cu002Fcodeu003E方法根据类型获取对应的class,然后根据class类型获取注册到spring中的bean。u003Cu002Fpu003Eu003Cpu003E最后请注意一点,HandlerProcessor和BeanTool必须能被扫描到,或者通过@Bean的方式显式的注册,才能在项目启动时发挥作用。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h1″u003E总结u003Cu002Fh1u003Eu003Cpu003E利用策略模式可以简化繁杂的if else代码,方便维护,而利用自定义注解和自注册的方式,可以方便应对需求的变更。本文只是提供一个大致的思路,还有很多细节可以灵活变化,例如使用枚举类型、或者静态常量,作为订单的类型,相信你能想到更多更好的方法。u003Cu002Fpu003Eu003Cpu003E-END-u003Cu002Fpu003Eu003Cpu003E如果看到这里,说明你喜欢这篇文章,帮忙u003Cstrong toutiao-origin=”span” class=”highlight-text”u003E转发u003Cu002Fstrongu003E一下吧,感谢。u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-4″u003E微信u003Cu002Fiu003Eu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-4″u003E搜索u003Cu002Fiu003E「web_resource」,u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-6″u003E关注u003Cu002Fiu003E后回复「进群」即可进入无广告u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003E交流群u003Cu002Fiu003E。u003Cu002Fpu003E”

原文始发于:在 Spring Boot 中,如何干掉 if else

主题测试文章,只做测试使用。发布者:℅傍ㄖ免沦陷dε鬼,转转请注明出处:http://www.cxybcw.com/18026.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code