依赖注入通俗解释

最近,我们公司开始开发一个新的基于Java的Web应用程序,经过一些评估过程,我们决定使用Spring。
但是许多团队成员并不了解Spring和Dependency Injection的原理。 因此,我被要求给出一个速成班,讲解什么是依赖注入和Spring的基础知识。

我没有讲所有有关IOC / DI的理论,而是想举例说明。

要求:我们将获得一些客户地址,并且需要验证该地址。
经过一番评估,我们考虑使用Google地址验证服务。

传统(不良)方法:

只需创建一个AddressVerificationService类并实现逻辑即可。

假定GoogleAddressVerificationService是Google提供的一项服务,该服务将Address作为字符串并返回经度/纬度。

class AddressVerificationService
{public String validateAddress(String address){GoogleAddressVerificationService gavs = new GoogleAddressVerificationService();String result = gavs.validateAddress(address);  return result;}
}

这种方法的问题:

1.如果要更改地址验证服务提供商,则需要更改逻辑。
2.您不能使用某些虚拟AddressVerificationService进行单元测试(使用模拟对象)

由于某些原因,客户要求我们支持多个AddressVerificationService Providers,因此我们需要确定在运行时使用哪种服务。

为了适应这一点,您可能会想到更改以下类:

class AddressVerificationService
{
//This method validates the given address and return longitude/latitude details.public String validateAddress(String address){String result = null;int serviceCode = 2; // read this code value from a config fileif(serviceCode == 1){GoogleAddressVerificationService googleAVS = new GoogleAddressVerificationService();result = googleAVS.validateAddress(address);} else if(serviceCode == 2){YahooAddressVerificationService yahooAVS = new YahooAddressVerificationService();result = yahooAVS.validateAddress(address);}return result;}
}

这种方法的问题:
 
1.每当需要支持新的服务提供商时,都需要使用if-else-if添加/更改逻辑。 2.您不能使用某些虚拟AddressVerificationService进行单元测试(使用模拟对象)

IOC / DI方法:

在上述方法中,AddressVerificationService负责控制其依赖项的创建。
因此,只要其依赖项发生更改,AddressVerificationService就会更改。

现在,让我们使用IOC / DI模式重写AddressVerificationService。

class AddressVerificationService{private AddressVerificationServiceProvider serviceProvider;public AddressVerificationService(AddressVerificationServiceProvider serviceProvider) {this.serviceProvider = serviceProvider;}public String validateAddress(String address){return this.serviceProvider.validateAddress(address);}}interface AddressVerificationServiceProvider{public String validateAddress(String address);}

在这里,我们注入了AddressVerificationService依赖项AddressVerificationServiceProvider。

现在,让我们使用多个提供程序服务来实现AddressVerificationServiceProvider。

class YahooAVS implements AddressVerificationServiceProvider{@Overridepublic String validateAddress(String address) {System.out.println("Verifying address using YAHOO AddressVerificationService");return yahooAVSAPI.validate(address);}  }class GoogleAVS implements AddressVerificationServiceProvider{@Overridepublic String validateAddress(String address) {System.out.println("Verifying address using Google AddressVerificationService");return googleAVSAPI.validate(address);}}

现在,客户可以选择使用哪个服务提供商的服务,如下所示:

AddressVerificationService verificationService = null;AddressVerificationServiceProvider provider = null;provider = new YahooAVS();//to use YAHOO AVSprovider = new GoogleAVS();//to use Google AVSverificationService = new AddressVerificationService(provider);String lnl = verificationService.validateAddress("HitechCity, Hyderabad");System.out.println(lnl);

对于单元测试,我们可以实现一个Mock AddressVerificationServiceProvider。

class MockAVS implements AddressVerificationServiceProvider{@Overridepublic String validateAddress(String address) {System.out.println("Verifying address using MOCK AddressVerificationService");return "<response><longitude>123</longitude><latitude>4567</latitude>";}}AddressVerificationServiceProvider provider = null;provider = new MockAVS();//to use MOCK AVS  AddressVerificationServiceIOC verificationService = new AddressVerificationServiceIOC(provider);String lnl = verificationService.validateAddress("Somajiguda, Hyderabad");System.out.println(lnl);

通过这种方法,我们可以解决上述基于非IOC / DI的方法的问题。
1.我们可以根据需要提供尽可能多的商品。 只需实现AddressVerificationServiceProvider并将其注入即可。
2.我们可以使用模拟实现使用虚拟数据进行单元测试。

因此,通过遵循“依赖注入”原理,我们可以创建基于接口的松散耦合且易于测试的服务。

参考: 我是如何通过JCG合作伙伴 Siva Reddy在“ 我的实验”博客上 向我的团队解释依赖注入的 。

翻译自: https://www.javacodegeeks.com/2012/06/how-i-explained-dependency-injection-to.html

依赖注入通俗解释

依赖注入通俗解释_我如何向团队解释依赖注入相关推荐

  1. 缓存通俗解释_在超市购买牛奶解释了网络缓存

    缓存通俗解释 by Kevin Kononenko 凯文·科诺年科(Kevin Kononenko) 在超市购买牛奶解释了网络缓存 (Web Caching Explained by Buying M ...

  2. spring循环依赖及解决方式_来探究一下Spring 循环依赖的三种方式

    引言:循环依赖就是N个类中循环嵌套引用,如果在日常开发中我们用new 对象的方式发生这种循环依赖的话程序会在运行时一直循环调用,直至内存溢出报错.下面说一下Spring是如果解决循环依赖的. 第一种: ...

  3. ce变速注入dll失败_[LAB]一种无痕Dll模块注入方式

    0x00 前言 方式:CreateRemoteThread 需要:visual studio 2015 需要:进程模块查看器,如[PCHunter][ProcessHacker]等. 需要:创建一个用 ...

  4. 名词解释_写字楼租赁相关名词解释

    对于租赁写字楼的租户来说,那些繁琐的合同是很令人头疼的.有时候连最基础的一些问题还没得到解决,就要面对一堆复杂的文书,会使租赁写字楼的租户开始迟疑.那么在这里我们给大家科普一下关于写字楼租赁你需要知道 ...

  5. 图像化转向名词解释_遥感——数字图像处理名词解释及简单整理

    Unit 1 1 . 图像 是对客观存在的物体的一种相似性的.生动的写真或描述. 2 .图像处理的内容 它是研究图像的获取.传输.存储.变换.显示.理解与综合利用的一 门崭新学科.根据抽象程度不同可 ...

  6. 我如何向团队解释依赖注入

    最近,我们公司开始开发基于Java的新Web应用程序,经过一些评估过程,我们决定使用Spring. 但是许多团队成员并不了解Spring和Dependency Injection的原理. 因此,我被要 ...

  7. java中依赖注入_关于Java:什么是依赖注入?

    本问题已经有最佳答案,请猛点这里访问. Possible Duplicate: What is Inversion of Control? 我真的很困惑依赖注入的概念. 我对软件领域非常陌生,我对下面 ...

  8. spring 循环依赖_简单说说 Spring 的循环依赖

    作者 | 田伟然 回首向来萧瑟处,归去,也无风雨也无晴. 杏仁工程师,关注编码和诗词. 前言 本文最耗时间的点就在于想一个好的标题, 既要灿烂夺目,又要光华内敛,事实证明这比砍需求还要难! 由于对象之 ...

  9. 依赖注入框架Dagger2详解(一),依赖注入和控制反转的深入理解

    IoC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合.更优良的程序,而Dagger2框架是依赖注入思想践行者的优秀代表. 依赖注入框架Dagger2详解(一), ...

最新文章

  1. uni-app如何取消pages页面的默认返回按钮【autoBackButton属性】
  2. python结束线程池正在运行的线程_python之线程与线程池
  3. android 检测过程,Android 系统对permision的检测过程
  4. HTML5结合ajax实现文件上传以及进度显示
  5. centos 删除crontab_Centos7 利用crontab定时执行任务及配置方法
  6. 京东金融回应用户遭盗刷:系用户点击假冒链接 输短信验证码致密码泄露
  7. 嵌入式系统功能需求分析_机械管理系统如何物料需求分析
  8. 堆排序建堆复杂度在特殊情况下的推导
  9. 锦城学院计算机系考研,奋斗的青春, 滚烫的人生—— —我的考研路
  10. 研磨设计模式-设计模式的基础-设计模式的学习【思路】
  11. 现阶段选择ArcMap还是ArcGIS Pro
  12. 我想外包开发一个预约类小程序,大概需要多少钱?
  13. 【图文并茂】U盘重装Win10方法教程
  14. CCF 202109-2 非零段划分(动态规划法,过了70%)
  15. 360怎样修改wifi服务器,360路由器怎么设置无线网络
  16. 《黑客与画家》读书笔记(三)
  17. 码支付源码 无授权—个人免签约支付系统二维码收款即时到账源码
  18. vue:高德地图的使用
  19. python中最小公倍数函数_python求最大公约数和最小公倍数的简单方法
  20. python用一维数组存储学号和成绩_用一维数组存储学号和成绩,然后,按成绩排序输出...

热门文章

  1. 史上最全Redis面试题
  2. sql serve基础
  3. 脚本可以放在html外,关于把script脚本放在html结束标签外的运行结果???
  4. php中对象的遍历输出,PHP中的对象遍历技巧
  5. spring boot actuator 入门荔枝
  6. mybatis_user_guide(4) Mapper XML 文件
  7. java数据库编程——元数据(metadata)+web 与企业应用中的连接管理
  8. 第一个JDK 10(18.3)候选版本(内部版本43)展示了新的版本控制方案
  9. java mic波形识别_会议季Mic Drop:您不应该错过的13场Java演讲
  10. 春春幼儿园堆积木大赛_春云边车