前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Spring Boot 如何干掉 if else?

Spring Boot 如何干掉 if else?

作者头像
Java技术栈
发布于 2019-06-14 03:08:06
发布于 2019-06-14 03:08:06
4680
举报
文章被收录于专栏:Java技术栈Java技术栈

作者:cipher http://www.ciphermagic.cn/spring-boot-without-if-else.html

需求

这里虚拟一个业务需求,让大家容易理解。假设有一个订单系统,里面的一个功能是根据订单的不同类型作出不同的处理。

订单实体:

service接口:

传统实现

根据订单类型写一堆的if else:

策略模式实现

利用策略模式,只需要两行即可实现业务逻辑:

可以看到上面的方法中注入了HandlerContext,这是一个处理器上下文,用来保存不同的业务处理器,具体在下文会讲解。我们从中获取一个抽象的处理器AbstractHandler,调用其方法实现业务逻辑。

现在可以了解到,我们主要的业务逻辑是在处理器中实现的,因此有多少个订单类型,就对应有多少个处理器。以后需求变化,增加了订单类型,只需要添加相应的处理器就可以,上述OrderServiceV2Impl完全不需改动。

我们先看看业务处理器的写法:

首先每个处理器都必须添加到spring容器中,因此需要加上@Component注解,其次需要加上一个自定义注解@HandlerType,用于标识该处理器对应哪个订单类型,最后就是继承AbstractHandler,实现自己的业务逻辑。

自定义注解 @HandlerType:

抽象处理器 AbstractHandler:

自定义注解和抽象处理器都很简单,那么如何将处理器注册到spring容器中呢?

具体思路是:

1、扫描指定包中标有@HandlerType的类;

2、将注解中的类型值作为key,对应的类作为value,保存在Map中;

3、以上面的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代码,方便维护,而利用自定义注解和自注册的方式,可以方便应对需求的变更。本文只是提供一个大致的思路,还有很多细节可以灵活变化,例如使用枚举类型、或者静态常量,作为订单的类型,相信你能想到更多更好的方法。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java技术栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
在 Spring Boot 中,如何干掉 if else!
这里虚拟一个业务需求,让大家容易理解。假设有一个订单系统,里面的一个功能是根据订单的不同类型作出不同的处理。
芋道源码
2019/05/22
1.5K0
在 Spring Boot 中,如何干掉 if else!
Spring Boot中如何干掉if else
这里虚拟一个业务需求,让大家容易理解。假设有一个订单系统,里面的一个功能是根据订单的不同类型作出不同的处理。
java架构师
2019/04/22
5180
Spring Boot中如何干掉if else
在 Spring Boot 中,如何干掉 if else
这里虚拟一个业务需求,让大家容易理解。假设有一个订单系统,里面的一个功能是根据订单的不同类型作出不同的处理。
一行Java
2023/02/23
1.2K0
在 Spring Boot 中,如何干掉 if else
使用策略模式干掉大片的 if else
后续补充 讲的不错 https://zhuanlan.zhihu.com/p/91667659
丁D
2022/08/12
3510
在 Spring Boot 中,如何干掉 if else
来自:https://blog.csdn.net/hncu1306602liuqiang
良月柒
2021/11/10
5100
使用策略模式消除if else代码
业务需求是,有一个代报考系统,里面的一个功能是根据报考类目的不同维护不同的代报考规则。
IT小马哥
2020/11/16
6090
如何优雅的用策略模式,取代臃肿的 if-else 嵌套,看这篇就够了
Java的二十几种设计模式背的滚瓜烂熟,为什么这个时候不想着尝试用一下?说不定能轻松的解决掉哦
程序员小富
2020/01/17
4.6K0
如何优雅的用策略模式,取代臃肿的 if-else 嵌套,看这篇就够了
Springboot 简化if else 和 Switch
需求:虚拟一个业务需求,让大家容易理解。假设有一个订单系统,里面的一个概念是根据订单的不同类型做出不同的处理。
OY
2022/03/20
7350
Springboot 简化if else 和 Switch
如何优雅的在SpringBoot中编写选择分支,而不是大量if else?
部门编号通常由公司或组织的管理人员根据实际情况进行规划和安排,各个部门的编号应当具有独立性、唯一性和易于记忆等特点,以方便在日常管理活动中使用。
Designer 小郑
2023/08/01
2310
如何优雅的在SpringBoot中编写选择分支,而不是大量if else?
教你如何干掉你代码中的一坨if-else
对于业务开发来说,业务逻辑的复杂是必然的,随着业务发展,需求只会越来越复杂,为了考虑到各种各样的情况,代码中不可避免的会出现很多if-else。
用户1260737
2019/11/12
6550
教你如何干掉你代码中的一坨if-else
详解Spring Boot 自动配置机制
一、简介 Spring boot 是一个基于 Spring框架开发,高于 Spring 框架,它对 Spring 做了更好的封装,提供了更多的产品级特性,极大的提升了 Spring 的可用性。 Spring 的配置一直都是诟病,直到 Java Config 推出之后,得到了很大的改善,但Java Config 也存在很多问题,例如:开发人员往往找不到配置到底在哪! Spring Boot 统一了配置模式(application.yml),并且提供了很多的默认配置,让我们可以有更多的时间关注业务逻辑;当需要进
yuanyi928
2018/03/30
1.3K0
详解Spring Boot 自动配置机制
昨天面了一位,见识到了Spring的天花板~
有人说,“Java程序员都是Spring程序员”,本人不太赞成这个观点,但是这也可以看出Spring在Java世界里举足轻重的作用。
用户10216580
2022/12/06
6680
昨天面了一位,见识到了Spring的天花板~
Spring框架为何这么叼?
Spring作为一个优秀的企业级应用框架,提供了企业开发过程中大多数基础功能的支持,如:事务,切面,web支持,数据库支持,ORM,OXM等等等等。但它不仅仅只是提供了这些基础功能,而是在提供这些基础功能的同时,给开发人员留下了许许多多的功能扩展点,使用者可以利用这些扩展点随意加入自己想要的其他功能,这也是Spring开闭原则的精髓。比如:常见的一些企业中间件例如:Dubbo,JSF,MyBatis,又或者是近些年比较流行的微服务框架SpringCloud等,其功能都是在Spring提供的扩展点之上扩展出来的新功能。那么Spring中经常使用到的扩展点有哪些呢?
程序员小猿
2021/01/19
2730
【Spring源码】- 01 Spring IoC容器启动之this方法
通过上面的输出结果可以看出,三个TestService都被纳入了Spring IoC容器中,但却是通过三种不同方式实现的,@ComponentScan、@Import和@Bean,从输入结果来看,IoC容器中除了自定义的类外,还有几个非我们自定义的Bean,它们又是从哪里引入的、引入进来又有什么用呢?下面我们就通过源码方式分析下IoC的启动流程,看看IoC容器启动的背后到底隐藏了哪些玄机。
Reactor2020
2023/03/22
2300
【Spring源码】- 01 Spring IoC容器启动之this方法
Spring是如何使用责任链模式的?
关于责任链模式,其有两种形式,一种是通过外部调用的方式对链的各个节点调用进行控制,从而进行链的各个节点之间的切换。
Java技术栈
2019/11/08
1.5K0
Spring是如何使用责任链模式的?
Spring知识整理
李家酒馆酒保
2017/12/27
6070
Spring知识整理
给你一份超详细 Spring Boot 知识清单
在过去两三年的Spring生态圈,最让人兴奋的莫过于Spring Boot框架。或许从命名上就能看出这个框架的设计初衷:快速的启动Spring应用。因而Spring Boot应用本质上就是一个基于Spring框架的应用,它是Spring对“约定优先于配置”理念的最佳实践产物,它能够帮助开发者更快速高效地构建基于Spring生态圈的应用。
Java技术栈
2018/09/29
5990
springboot之mvc原理(二)-能力支持
前边一篇文章《springboot之mvc原理(一)-请求处理》我们详细分析了springboot应用接收http请求的处理过程,那么进一步的思考一下,为什么应用启动支持就能处理http请求了呢?在应用启动过程中springboot帮我们做了什么呢?DispatchServlet使用的各种组件哪里来的?本篇文章我们将从原理和源码层面对springboot的web能力支持做一下分析和描述。
叔牙
2020/11/19
1K0
springboot之mvc原理(二)-能力支持
Spring中如何使用责任链模式
关于责任链模式,其有两种形式,一种是通过外部调用的方式对链的各个节点调用进行控制,从而进行链的各个节点之间的切换;另一种是链的每个节点自由控制是否继续往下传递链的进度,这种比较典型的使用方式就是Netty中的责任链模式。
田维常
2019/07/16
4.5K0
Spring中如何使用责任链模式
面渣逆袭:Spring三十五问,四万字+五十图详解
大家好,我是老三啊,面渣逆袭 继续,这节我们来搞定另一个面试必问知识点——Spring。
三分恶
2022/05/11
7880
面渣逆袭:Spring三十五问,四万字+五十图详解
相关推荐
在 Spring Boot 中,如何干掉 if else!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文