松鼠乐园 松鼠乐园
  • 注册
  • 登录
  • 首页
  • 快捷入口
    • Vue
    • Tensorflow
    • Springboot
    • 语言类
      • CSS
      • ES5
      • ES6
      • Go
      • Java
      • Javascript
    • 工具类
      • Git
      • 工具推荐
    • 服务器&运维
      • Centos
      • Docker
      • Linux
      • Mac
      • MySQL
      • Nginx
      • Redis
      • Windows
    • 资源类
      • 论文
      • 书籍推荐
      • 后端资源
      • 前端资源
      • html网页模板
      • 代码
    • 性能优化
    • 测试
  • 重大新闻
  • 人工智能
  • 开源项目
  • Vue2.0从零开始
  • 广场
首页 › Springboot › SpringBoot是如何干掉繁琐的if..else的?

SpringBoot是如何干掉繁琐的if..else的?

迦娜王
3年前Springboot
838 0 1
来自:掘金(作者:cipher) 原文链接:http://juejin.im/post/5c551122e51d457fcc5a9790 需求 这里虚拟一个业务需求,让大家容易理解。假设有一个订单系统,里面的一个功能是根据订单的不同类型作出不同的处理。 订单实体:
SpringBoot是如何干掉繁琐的if..else的?
service接口:
SpringBoot是如何干掉繁琐的if..else的?

传统实现

根据订单类型写一堆的if else:
SpringBoot是如何干掉繁琐的if..else的?

策略模式实现

利用策略模式,只需要两行即可实现业务逻辑:
SpringBoot是如何干掉繁琐的if..else的?
可以看到上面的方法中注入了HandlerContext,这是一个处理器上下文,用来保存不同的业务处理器,具体在下文会讲解。我们从中获取一个抽象的处理器AbstractHandler,调用其方法实现业务逻辑。 现在可以了解到,我们主要的业务逻辑是在处理器中实现的,因此有多少个订单类型,就对应有多少个处理器。以后需求变化,增加了订单类型,只需要添加相应的处理器就可以,上述OrderServiceV2Impl完全不需改动。 我们先看看业务处理器的写法:
SpringBoot是如何干掉繁琐的if..else的?
SpringBoot是如何干掉繁琐的if..else的?
SpringBoot是如何干掉繁琐的if..else的?
首先每个处理器都必须添加到spring容器中,因此需要加上@Component注解,其次需要加上一个自定义注解@HandlerType,用于标识该处理器对应哪个订单类型,最后就是继承AbstractHandler,实现自己的业务逻辑。 自定义注解 @HandlerType:
SpringBoot是如何干掉繁琐的if..else的?
抽象处理器 AbstractHandler:
SpringBoot是如何干掉繁琐的if..else的?
自定义注解和抽象处理器都很简单,那么如何将处理器注册到spring容器中呢? 具体思路是: 1、扫描指定包中标有@HandlerType的类; 2、将注解中的类型值作为key,对应的类作为value,保存在Map中; 3、以上面的map作为构造函数参数,初始化HandlerContext,将其注册到spring容器中; 我们将核心的功能封装在HandlerProcessor类中,完成上面的功能。 HandlerProcessor:
SpringBoot是如何干掉繁琐的if..else的?

ClassScanner:扫描工具类源码

HandlerProcessor需要实现BeanFactoryPostProcessor,在spring处理bean前,将自定义的bean注册到容器中。 核心工作已经完成,现在看看HandlerContext如何获取对应的处理器: HandlerContext:
SpringBoot是如何干掉繁琐的if..else的?
BeanTool:获取bean工具类 #getInstance 方法根据类型获取对应的class,然后根据class类型获取注册到spring中的bean。 最后请注意一点,HandlerProcessor和BeanTool必须能被扫描到,或者通过@Bean的方式显式的注册,才能在项目启动时发挥作用。

总结

利用策略模式可以简化繁杂的if else代码,方便维护,而利用自定义注解和自注册的方式,可以方便应对需求的变更。本文只是提供一个大致的思路,还有很多细节可以灵活变化,例如使用枚举类型、或者静态常量,作为订单的类型,相信你能想到更多更好的方法。
SpringBoot
1
nginx如何防止DDOS攻击?读完之后,大部分程序员收藏了
上一篇
GitHub开源项目推荐:腾讯、12306、Vue、面试
下一篇
评论 (0)

请登录以参与评论。

现在登录
聚合文章
Servicios profesionales Organizaciones
1年前
在Gitee收获近 5k Star,更新后的Vue版RuoYi有哪些新变化?
1年前
vue3.x reactive、effect、computed、watch依赖关系及实现原理
1年前
Vue 3 新特性:在 Composition API 中使用 CSS Modules
1年前
标签
AI AI项目 css docker Drone Elaticsearch es5 es6 Geometry Go gru java Javascript jenkins lstm mysql mysql优化 mysql地理位置索引 mysql索引 mysql规范 mysql设计 mysql配置文件 mysql面试题 mysql高可用 nginx Redis redis性能 rnn SpringBoot Tensorflow tensorflow2.0 UI设计 vue vue3.0 vue原理 whistle ZooKeeper 开源项目 抓包工具 日志输出 机器学习 深度学习 神经网络 论文 面试题
1
相关文章
两年摸爬滚打 Spring Boot,总结了这 16 条最佳实践
「开源」10个优秀的SpringBoot项目,总有你喜欢的
给你一份超详细Spring Boot知识清单
Spring Boot 核心知识,深入剖析,请收藏
松鼠乐园

资源整合,创造价值

小伙伴
墨魇博客 无同创意
目录
重大新闻 Centos CSS Docker ES5 ES6 Go Java Javascript Linux Mac MySQL Nginx Redis Springboot Tensorflow Vue Vue2.x从零开始 Windows 书籍推荐 人工智能 前端资源 后端资源 壁纸 开源项目 测试 论文
Copyright © 2018-2022 松鼠乐园. Designed by nicetheme. 浙ICP备15039601号-4
  • 重大新闻
  • Centos
  • CSS
  • Docker
  • ES5
  • ES6
  • Go
  • Java
  • Javascript
  • Linux
  • Mac
  • MySQL
  • Nginx
  • Redis
  • Springboot
  • Tensorflow
  • Vue
  • Vue2.x从零开始
  • Windows
  • 书籍推荐
  • 人工智能
  • 前端资源
  • 后端资源
  • 壁纸
  • 开源项目
  • 测试
  • 论文
热门搜索
  • jetson nano
  • vue
  • java
  • mysql
  • 人工智能
  • 人脸识别
迦娜王
坚持才有希望
1224 文章
35 评论
242 喜欢
  • 1
  • 0
  • Top