zoukankan      html  css  js  c++  java
  • Spring 动态绑定多实现类实例综述

      摘要: 由于业务场景复杂,一个算法需要开发行为变化多端的多个实现类,然后在系统运行时根据不同场景装载不同的类实例。为了使应用程序具有更好的灵活性、可扩展性和代码的可重用性,在借鉴前人处理方法的基础上,通过资料的分析,探索建立了一套 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,那么请不吝赐教,在文章下方评论区留下你的神评妙论!


      读后有收获,小礼物走一走,请作者喝咖啡。

    赞赏支持

  • 相关阅读:
    JQuery实现1024小游戏
    Windows Server2008 R2安装wampserver缺少api-ms-win-crt-runtime-l1-1-0.dll解决方案
    ASP.NET MVC 邮件发送的功能(微软邮箱发送)。
    浅谈撞库防御策略
    极验高并发验证服务背后的技术实现
    2015年国内数据安全事件盘点
    转载——验证码的昨天、今天和明天
    转载——最近百度云盘不提供搜索,闲来无事,玩玩python爬虫,爬一下百度云盘的资源
    SQL 查询语句
    SQL Server 目录
  • 原文地址:https://www.cnblogs.com/east7/p/14320283.html
Copyright © 2011-2022 走看看