依赖注入通俗解释_我如何向团队解释依赖注入
依赖注入通俗解释
我没有讲所有有关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
依赖注入通俗解释
依赖注入通俗解释_我如何向团队解释依赖注入相关推荐
- 缓存通俗解释_在超市购买牛奶解释了网络缓存
缓存通俗解释 by Kevin Kononenko 凯文·科诺年科(Kevin Kononenko) 在超市购买牛奶解释了网络缓存 (Web Caching Explained by Buying M ...
- spring循环依赖及解决方式_来探究一下Spring 循环依赖的三种方式
引言:循环依赖就是N个类中循环嵌套引用,如果在日常开发中我们用new 对象的方式发生这种循环依赖的话程序会在运行时一直循环调用,直至内存溢出报错.下面说一下Spring是如果解决循环依赖的. 第一种: ...
- ce变速注入dll失败_[LAB]一种无痕Dll模块注入方式
0x00 前言 方式:CreateRemoteThread 需要:visual studio 2015 需要:进程模块查看器,如[PCHunter][ProcessHacker]等. 需要:创建一个用 ...
- 名词解释_写字楼租赁相关名词解释
对于租赁写字楼的租户来说,那些繁琐的合同是很令人头疼的.有时候连最基础的一些问题还没得到解决,就要面对一堆复杂的文书,会使租赁写字楼的租户开始迟疑.那么在这里我们给大家科普一下关于写字楼租赁你需要知道 ...
- 图像化转向名词解释_遥感——数字图像处理名词解释及简单整理
Unit 1 1 . 图像 是对客观存在的物体的一种相似性的.生动的写真或描述. 2 .图像处理的内容 它是研究图像的获取.传输.存储.变换.显示.理解与综合利用的一 门崭新学科.根据抽象程度不同可 ...
- 我如何向团队解释依赖注入
最近,我们公司开始开发基于Java的新Web应用程序,经过一些评估过程,我们决定使用Spring. 但是许多团队成员并不了解Spring和Dependency Injection的原理. 因此,我被要 ...
- java中依赖注入_关于Java:什么是依赖注入?
本问题已经有最佳答案,请猛点这里访问. Possible Duplicate: What is Inversion of Control? 我真的很困惑依赖注入的概念. 我对软件领域非常陌生,我对下面 ...
- spring 循环依赖_简单说说 Spring 的循环依赖
作者 | 田伟然 回首向来萧瑟处,归去,也无风雨也无晴. 杏仁工程师,关注编码和诗词. 前言 本文最耗时间的点就在于想一个好的标题, 既要灿烂夺目,又要光华内敛,事实证明这比砍需求还要难! 由于对象之 ...
- 依赖注入框架Dagger2详解(一),依赖注入和控制反转的深入理解
IoC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合.更优良的程序,而Dagger2框架是依赖注入思想践行者的优秀代表. 依赖注入框架Dagger2详解(一), ...
最新文章
- uni-app如何取消pages页面的默认返回按钮【autoBackButton属性】
- python结束线程池正在运行的线程_python之线程与线程池
- android 检测过程,Android 系统对permision的检测过程
- HTML5结合ajax实现文件上传以及进度显示
- centos 删除crontab_Centos7 利用crontab定时执行任务及配置方法
- 京东金融回应用户遭盗刷:系用户点击假冒链接 输短信验证码致密码泄露
- 嵌入式系统功能需求分析_机械管理系统如何物料需求分析
- 堆排序建堆复杂度在特殊情况下的推导
- 锦城学院计算机系考研,奋斗的青春, 滚烫的人生—— —我的考研路
- 研磨设计模式-设计模式的基础-设计模式的学习【思路】
- 现阶段选择ArcMap还是ArcGIS Pro
- 我想外包开发一个预约类小程序,大概需要多少钱?
- 【图文并茂】U盘重装Win10方法教程
- CCF 202109-2 非零段划分(动态规划法,过了70%)
- 360怎样修改wifi服务器,360路由器怎么设置无线网络
- 《黑客与画家》读书笔记(三)
- 码支付源码 无授权—个人免签约支付系统二维码收款即时到账源码
- vue:高德地图的使用
- python中最小公倍数函数_python求最大公约数和最小公倍数的简单方法
- python用一维数组存储学号和成绩_用一维数组存储学号和成绩,然后,按成绩排序输出...
热门文章
- 史上最全Redis面试题
- sql serve基础
- 脚本可以放在html外,关于把script脚本放在html结束标签外的运行结果???
- php中对象的遍历输出,PHP中的对象遍历技巧
- spring boot actuator 入门荔枝
- mybatis_user_guide(4) Mapper XML 文件
- java数据库编程——元数据(metadata)+web 与企业应用中的连接管理
- 第一个JDK 10(18.3)候选版本(内部版本43)展示了新的版本控制方案
- java mic波形识别_会议季Mic Drop:您不应该错过的13场Java演讲
- 春春幼儿园堆积木大赛_春云边车