摘要: 由于业务场景复杂,一个算法需要开发行为变化多端的多个实现类,然后在系统运行时根据不同场景装载不同的类实例。为了使应用程序具有更好的灵活性、可扩展性和代码的可重用性,在借鉴前人处理方法的基础上,通过资料的分析,探索建立了一套 Spring Boot 项目动态绑定算法相关实现类实例并调用其函数的策略,主要涉及的知识点包括责任链模式、策略模式、工厂模式和模板方法模式等四个设计模式,以及Spring IoC技术和Spring注解等。

§前言

  在软件开发过程中,由于客户的业务场景比较复杂,需要一个功能根据不同的业务场景表现出不同的行为。例如,出去旅游时,可供选择的交通工具有多种,诸如飞机、高铁、大巴和顺风车等,但是对系统而言,入口应该仅有一个,就是调用的函数是同一个,不过是由不同的实现类帮你规划不同的交通工具,然后根据选定的交通工具计算交通费。

  我情不自禁地思考了一个问题,在目前的Java web项目开发中,相信大家基本上是基于Spring框架的,那么Spring是怎样从IoC容器中准确而优雅地动态绑定我们想要的实现类实例的呢?

§业务场景

  需求描述:定制一个绘图工具,她根据客户端发送的指令可以画出正方形、矩形、圆形和三角形等各种各样的几何图形。例如,当客户端需要绘制三角形的时候,就调用绘制三角形的方法;当需要绘制圆形的时候,就调用绘制圆形的方法。

  业务分析:我们需要根据图形标识查找该图形的Bean实例,从而调用该实例中的绘图函数绘制指定图形。其本质就是方法的多态。

  方法多态:方法的多态就是一个方法名称有不同的实现,其实就是方法的重载,在调用方法的时候具体调用哪一-个是在运行期根据传递的实际参数的类型来确定调用哪一个方法,也就是同一个方法名称可以有不同的表现形式,这就是方法的多态。方法多态的表现就是方法的重载。

  初步想到的设计方案就是如《Spring Boot中使用注解实现简单工厂模式》中“实现方法一:基于新建对象实现”所言,在简单工厂模式中通过传递几何图形类型信息,由 if else或者case等条件判断语句逐个判断,然后获取实体类的对象,源码如下图所示:

  试想一下,如果绘图工具由于业务拓展,需要添加越来越多的图形,比如:新增五角星、仙人掌图、五边形、六边形等等,就需要修改工厂类,增加新的else...if判断,判断多了就会导致逻辑越来越多,使代码充满臭味道。

  很明显,这样的代码违反了设计模式六大原则中的开闭原则和单一职责原则:

开闭原则:对扩展开放,对修改关闭。就是说增加新功能要尽量少改动已有代码。

单一职责原则:顾名思义,要求逻辑尽量单一,不要太复杂,便于复用。

  那有什么办法可以实现业务需求的同时,码出优雅且易扩展的代码呢?

§解决方案

  本篇博文以一系列博文的形式,使用Spring Boot 2.3.0.RELEASE版本,基于Spring 注解、责任链模式、策略模式、工厂模式和模板方法模式等知识点向大家展示如何解决这个问题。博文包括以下几篇:

  1. Spring注解之@Autowired:按类型自动装配Bean到数组、集合和Map
  2. 获取Spring ApplicationContext容器上下文对象实例
  3. Spring Boot中使用注解实现简单工厂模式;
  4. 使用模板方法模式动态绑定多实现类实例
  5. 使用责任链模式动态绑定多实现类实例
  6. 使用策略模式和工厂模式动态绑定多实现类实例
  7. 使用自定义注解动态绑定多实现类实例

  前两篇介绍Spring Bean和IoC容器相关的基本知识,为后面几篇做铺垫。上述博文所用软件开发环境如下:

   java version 13.0.1

   IntelliJ IDEA 2019.3.2 (Ultimate Edition)

   Spring Boot 2.3.0.RELEASE

§结束语

  你如果计划跳槽,那就认真看看这些博客吧,只有掌握真正的技术才能如出水蛟龙,下山猛虎一样碾压面试官,拿到心满意足的offer。 你如果正在被这些技术困扰,更要仔仔细细地阅读几遍了。

  老铁们, 因楼兰胡杨个人能力有限,难免有瑕疵,如果发现bug或者有更好的idea,那么请不吝赐教,在文章下方评论区留下你的神评妙论!

Spring 动态绑定多实现类实例综述的更多相关文章

  1. Spring 的优秀工具类盘点

    文件资源操作 文件资源的操作是应用程序中常见的功能,如当上传一个文件后将其保存在特定目录下,从指定地址加载一个配置文件等等.我们一般使用 JDK 的 I/O 处理类完成这些操作,但对于一般的应用程序来 ...

  2. Spring中IoC的入门实例

    Spring中IoC的入门实例 Spring的模块化是很强的,各个功能模块都是独立的,我们可以选择的使用.这一章先从Spring的IoC开始.所谓IoC就是一个用XML来定义生成对象的模式,我们看看如 ...

  3. 在listener或者工具中使用spring容器中的bean实例

    在项目中经常遇见需要在Listener中或者工具中使用Spring容器中的bean实例,由于bean不能在stataic的类中使用. 介绍一种方式: public class SpringTool { ...

  4. Spring 的优秀工具类盘点第 1 部分

    文件资源操作 文件资源的操作是应用程序中常见的功能,如当上传一个文件后将其保存在特定目录下,从指定地址加载一个配置文件等等.我们一般使用 JDK 的 I/O 处理类完成这些操作,但对于一般的应用程序来 ...

  5. hibernate+spring的整合思路加实例(配图解)

    首先框架整合我感觉最难的是jar包的引入.因为不同框架的jar容易产生冲突.如果能排除这个因素我想说整合框架还是相对比较容易的. 我整合的框架的一个思想就是:各司其职.因为每个框架处理的事务或者是层次 ...

  6. Spring 自动转配类 在类中使用@Bean 注解进行转配但是需要排除该类说明

    在spring中可以使用 @Component @Configuration @Bean(实例化后返回该bean)进行类实例的自动装配. 需求: 排除指定需要自动转配的类. 说明: 1.在以上注解中  ...

  7. spring 配置 Java配置类装配bean

    https://www.cnblogs.com/chenbenbuyi/p/8457700.html 自动化装配的确有很大的便利性,但是却并不能适用在所有的应用场景,比如需要装配的组件类不是由自己的应 ...

  8. Spring入门1. IoC入门实例

    Spring入门1. IoC入门实例 Reference:Java EE轻量级解决方案——S2SH 前言: 之前学习过关于Spring的一点知识,曾经因为配置出现问题,而总是被迫放弃学习这些框架技术, ...

  9. Spring Ioc容器核心类继承图

    Spring IOC容器其实就是BeanFactory的实例,Spring中BeanFactory的类关系结构如下图: 从上图可以看出Beanfactory作为根接口又细化出三个二级接口,最后又有Co ...

  10. Spring 的优秀工具类盘点---转

    第 1 部分: 文件资源操作和 Web 相关工具类 http://www.ibm.com/developerworks/cn/java/j-lo-spring-utils1/ 文件资源操作 文件资源的 ...

随机推荐

  1. 机器人技术的突破让OpenAI过时了

    机器人技术的突破让OpenAI过时了 Ignacio de Gregorio 最近,Figure AI,一家价值数十亿美元的AI机器人公司,宣布取消与OpenAI的合作伙伴关系,这一举动看起来是相当大 ...

  2. wordpress无法显示gitee图床的图片

    wordpress无法显示gitee图床的图片 Question:如题 Solution:是防盗链的问题,gitee官网给出了防盗链的方法,而github貌似没有. Reference:你已经是个成熟 ...

  3. 2个月搞定计算机二级C语言——真题(11)解析

    1. 前言 今天双 11,正好轮到讲第 11 篇,直接来个三 11. 那么本篇我们讲解2个月搞定计算机二级C语言--真题11 2. 程序填空题 2.1 题目要求 2.2 提供的代码 #include ...

  4. 链表的创建&遍历打印

    博客地址:https://www.cnblogs.com/zylyehuo/ # -*- coding: utf-8 -*- class Node: def __init__(self, item): ...

  5. Ubuntu 下查看 ip

    博客地址:https://www.cnblogs.com/zylyehuo/ ip a

  6. SpringBoot+Hutool 文件导出Excel

    Hutool-poi是针对Apache POI的封装,因此需要用户自行引入POI库,Hutool默认不引入.到目前为止,Hutool-poi支持: Excel文件(xls, xlsx)的读取(Exce ...

  7. Linux下对LVM逻辑卷分区大小调整 [针对xfs和ext4文件系统]

    当我们在安装系统的时候,由于没有合理分配分区空间,在后续维护过程中,发现有些分区空间不够使用,而有的分区空间却有很多剩余空间.如果这些分区在装系统的时候使用了lvm(前提是这些分区要是lvm逻辑卷分区 ...

  8. vite 引入element

    import {fileURLToPath, URL} from 'node:url' import {defineConfig, loadEnv} from 'vite' import vue fr ...

  9. 【Ubuntu】“Linux版PhotoShop”绘图软件的安装和汉化

    [Ubuntu]"Linux版PhotoShop"绘图软件的安装和汉化 零.前言 最近换了Linux系统,但是写教程做PPT的时候还是得用到绘图软件,上网一查,总结对比之后发现Kr ...

  10. Ant Design Pro 中 点击子菜单的时候,其他菜单不自动收起来

    记录一波自己在这段时间碰到的一个Ant Design Pro 的坑: 每次点击菜单都会将其他菜单自动收起来,导致一系列的用户体验不佳. 设置defaultOpenAll: true后依然不管用 经过各 ...