在 Spring Boot 中,如何干掉 if else

DVWA靶场实战:手把手教你绕过文件上传限制,用蚁剑连接一句话木马 本文详细介绍了在DVWA靶场中如何绕过文件上传限制并利用蚁剑连接一句话木马的实战技巧。通过分析文件上传漏洞原理、创建一句话木马、使用Burp Suite拦截修改请求以及配置蚁剑连接WebShell的全过程,帮助安全研究人员深入理解Web安全防护与攻击技术。 阅读详情
  • 作者:cipher

  • https://juejin.im/post/5c551122e51d457fcc5a9790

需求

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

订单实体:

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:

ClassScanner:扫描工具类源码

HandlerProcessor需要实现BeanFactoryPostProcessor,在spring处理bean前,将自定义的bean注册到容器中。

核心工作已经完成,现在看看HandlerContext如何获取对应的处理器:

HandlerContext:

BeanTool:获取bean工具类

#getInstance 方法根据类型获取对应的class,然后根据class类型获取注册到spring中的bean。

最后请注意一点,HandlerProcessor和BeanTool必须能被扫描到,或者通过@Bean的方式显式的注册,才能在项目启动时发挥作用。

总结

利用策略模式可以简化繁杂的if else代码,方便维护,而利用自定义注解和自注册的方式,可以方便应对需求的变更。本文只是提供一个大致的思路,还有很多细节可以灵活变化,例如使用枚举类型、或者静态常量,作为订单的类型,相信你能想到更多更好的方法。

示例代码:https://github.com/ciphermagic/java-learn/tree/master/sandbox/src/main/java/com/cipher/handler_demo

【推荐阅读】

图文并茂,HashMap经典详解!

手把手教你如何玩转统一异常处理

最近面试Java后端开发的感受


好文!必须点赞

FPS游戏自动枪械识别+压枪(以PUBG为例) 使用Python3.9作为开发环境,实现一个通用的FPS游戏自动检测枪械配件+压枪宏的软件开发思路 阅读详情

相关推荐

大模型系统构建的“三驾马车”——Prompt、Context与Harness工程

在LLM应用开发的早期阶段,我们热衷于比拼“提示词”的精妙程度。那时,一个精心构造的思维链CoT就能让模型的表现提升10%以上。随着大模型从“玩具”走向“生产系统”,我们逐渐意识到:单一的 Prompt 只是起点,而非终点。 真正的工业级应用,需要构建一套三层递进的工程体系——Prompt Engineering、Context Engineering 和 Harness Engineering。

西木风落 604

Spring Boot中如何干掉if else

点击上方“Java之间”,选择“置顶或者星标”你关注的就是我关心的!作者:Java高级架构狮需求这里虚拟一个业务需求,让大家容易理解。假设有一个订单系统,里面的一个功能是...

Java之间 2621

利用Spm12进行fMRI数据分析:从预处理到结果解读的完整指南

本文提供了利用SPM12进行fMRI数据分析的完整流程指南,涵盖从数据预处理、统计建模到结果解读的全过程。详细介绍了在MATLAB环境下使用SPM12图形界面完成头动矫正、空间标准化等关键步骤的操作方法与避坑技巧,帮助神经科学研究者和心理学研究者高效处理功能磁共振成像数据并产出可靠结果。

weixin_29079671的博客 452

SpringMVC接入Spring框架原理

SpringMVC接入Spring框架原理 1.创建一个基础类实现ServletContainerInitializer接口,重写onStartup方法 public class DemoServlet implements ServletContainerInitializer { @Override public void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException

GuessHat的博客 368

01 高等数学 上下册知识点总结

极限与连续 8个等价无穷小 8个常用泰勒公式 高数复习——多元函数微分学 一、概念 一元函数: 可微<=>可导 △y=A△x+o(△x)dy=AdxA=f′(x)\triangle y=A\triangle x+o(\triangle x)\\dy=Adx\\A=f'(x)△y=A△x+o(△x)dy=AdxA=f′(x) 多元函数: 可微=>可导(可导指两个偏导数存在,反之不成立) 可微=>连续(反之不成立) △z=A△x+B△y+o(p)dz=Adx+BdyA=δzδxdx

qq_44292038的博客 1万+

Unity之ASE如何实现UV扰动闪电效果

UV扰动,顾名思义,就是通过干扰原贴图的UV,使UV发生变化,导致贴图出现会动的效果,如果我们贴图和扰动的速度调整的刚好合适的话,会出现一些非常棒的效果,比如下图所示的闪电效果:好了,一个简单的UV扰动就讲完了,同学们可以发挥想象力,我们是否可以利用UV扰动的原理,做一点别的炫酷的效果出来,比如,交错流动,流光效果等等。很期待你的留言,这篇文章就到这里,希望对你有所帮助。

TxNet 1789

springboot中如何使用策略模式干掉if—else

springboot中如何使用策略模式干掉if—else 常见if-else案列 public class OrderServiceImpl implements OrderService { @Override public String handle(OrderDTO dto) { String type = dto.getType(); if ("1".equals(type...

迷茫,是因为才华配不上梦想... 861

Unity 佳能SDK 及数据获取

3. 把CameraControl 下面只要是绿色的 .cs 文件都复制到Unity 中。1. 填写信息跟官方申请SDK,大概1-2个工作日会邮件回复你。2. 将SDK这两个文件放到 Unity Plugins文件夹。

我知道你很急,但是路要一步步走 1475

利用工厂模式和策略模式来替代if else

对于代码写到一定地步,肯定会遇到很多业务代码的繁琐的if else分支。简单的几个条件可以if else几个,但是一旦后面的条件越来越多,有没有更好的替代让代码看起来没那么臃肿。更好维护,而不是一个if一个if的看过去。 其实是有的,就是工厂模式加策略模式来替代成坨的if else。 一 设计模式理解 首先来分析一下主要用到的两个设计模式 工厂模式:实际上工厂模式写法很多,比如说根据产品还是工厂方法来区分简单工厂和工厂方法模式。 根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式。用于封装和管理对象的创建,

FeiChangWuRao的博客 2767

ROS与Qt5人机交互界面开发:添加rviz显示界面

最后,点击"完成"以创建新的Qt5应用程序项目。通过结合ROS和Qt5,您可以创建强大的人机交互界面,以实现丰富的机器人控制和数据可视化。在本教程中,我们将在主窗口中创建一个简单的按钮,用于启动rviz显示界面。在Qt Creator的槽函数编辑器中,为按钮添加一个槽函数,该函数将在单击按钮时调用。在上面的代码中,我们使用QProcess类启动了一个新的进程,并执行"rviz"命令来启动rviz显示界面。当您单击Qt5应用程序中的按钮时,将会启动一个新的rviz窗口,显示机器人数据的可视化界面。

CodeJolt的博客 2066

GD32F303标准库开发:Keil5新建GD32标准库工程

GD32F303标准库开发:Keil5新建GD32标准库工程

MQ0522的博客 8900

使用策略模式消除if else

最近项目中遇到如下情况: 有一个操作叫平帐,然后要对多个不同的款项进行平帐,目测有72种。 然后平帐的方法只有一个,在那个平帐方法里面,判断是哪一种款项,然后不同的款项有不同的处理逻辑。 if(款项A){ 款项A的处理方法; } if(款项B){ 款项B的处理方法; } if(款项C){ 款项C的处理方法; } … 这个就很可怕了。 因此使用策略模式来消除掉if else。 先看使用策略模式之后的...

hello world 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

在 Spring Boot 中,如何干掉 if/else!

本文探讨了在SpringBoot中消除复杂if/else结构的多种设计模式和技术方案。通过策略模式+枚举、工厂模式、注解驱动、责任链模式、状态模式等设计模式,结合Spring特性如依赖注入、条件装配、AOP等,可以将复杂的条件分支重构为清晰可扩展的结构。文章详细介绍了每种技术的实现方式、适用场景和优缺点,包括利用函数式编程简化代码、规则引擎处理复杂业务规则、对象映射框架减少转换逻辑等。最终建议根据实际需求选择合适的技术组合,遵循封装变化、面向接口等原则,编写更易维护的代码。

油墨香^-^的博客 812

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

在 Spring Boot 中,是怎样干掉 if else的

首先每个处理器都必须添加到spring容器中,因此需要加上@Component注解,其次需要加上一个自定义注解@HandlerType,用于标识该处理器对应哪个订单类型,最后就是继承AbstractHandler,实现自己的业务逻辑。既然是要面试,那么就少不了刷题,实际上春节回家后,哪儿也去不了,我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。最后祝愿各位身体健康,顺利拿到心仪的offer!

ssdrrg的博客 876

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

在 Spring Boot 中,如何干掉 if else!

点击上方 "程序员小乐"关注,星标或置顶一起成长每天凌晨00点00分,第一时间与你相约每日英文You usually find what you are lookin...

程序员小乐 325

Spring Boot 如何干掉 if else?

作者:cipherhttp://www.ciphermagic.cn/spring-boot-without-if-else.html需求这里虚拟一个业务需求,让大家容易...

Java技术栈,分享最主流的Java技术 872
上一篇: 基于 token 的多平台身份认证架构设计
下一篇: SpringBoot 微信点餐开源系统
Java思维导图
博客等级 码龄10年 306粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值