我如何向团队解释依赖注入
我没有讲所有有关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
我如何向团队解释依赖注入相关推荐
- 依赖注入通俗解释_我如何向团队解释依赖注入
依赖注入通俗解释 最近,我们公司开始开发一个新的基于Java的Web应用程序,经过一些评估过程,我们决定使用Spring. 但是许多团队成员并不了解Spring和Dependency Injectio ...
- 如何用最简单的方式解释依赖注入?依赖注入是如何实现解耦的?
第一章:小明和他的手机 从前有个人叫小明 小明有三大爱好,抽烟,喝酒-- 咳咳,不好意思,走错片场了.应该是逛知乎.玩王者农药和抢微信红包 小明的三大爱好 我们用一段简单的伪代码,来制造一个这样的小明 ...
- 依赖注入?依赖注入是如何实现解耦的?
如何用最简单的方式解释依赖注入?依赖注入是如何实现解耦的? 第一章:小明和他的手机 从前有个人叫小明 小明有三大爱好,抽烟,喝酒-- 咳咳,不好意思,走错片场了.应该是逛知乎.玩王者农药和抢微信红包 ...
- 【C#|.NET】从控制反转(依赖注入)想到事件注入 (非AOP)
前文 事件注入的想法是由依赖注入所联想到 依赖注入不算什么吸引人的话题 本篇就不详说了 不过有闲暇时间的机会不妨按照自己的兴趣去摸索.研究一些东西,也是一种乐子. 在抓虫系列里简单的描述一下依赖注入在 ...
- 在MVC3项目中结合NInject实现依赖注入
解释: 依赖注入:(Dependency Injection),也称之为控制反转. 大致意思就是,让我们的应用程序所依赖的一些外部服务,可以根据需要动态注入,而不是预先在应用程序中明确的约束.这种思想 ...
- dagger2 注入_如何使用Dagger 2在您的应用程序中实现依赖注入
dagger2 注入 Kriptofolio应用程序系列-第4部分 (Kriptofolio app series - Part 4) Dependency injection will signif ...
- python 依赖注入_Dependency Injection-依赖注入详解
依赖注入是目前很多优秀框架都在使用的一个设计模式.Java的开发框架如Spring在用,PHP的Laravel/Phalcon/Symfony等也在用.好多不同语言的框架,设计思想大同小异,相互借鉴参 ...
- Spring的控制反转(IOC)和依赖注入(DI)具体解释
Spring的控制反转(IOC)和依赖注入(DI)具体解释 首先介绍下(IOC)控制反转: 所谓控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的.这样控制器就有应 ...
- 简单解释什么是 依赖注入 和 控制反转
简单解释什么是 依赖注入 和 控制反转 2017-07-09 关于 依赖注入 与 控制反转 的概念有些人觉得很难理解,最近在给别人讲这个概念的时候梳理了一个比较好理解的解释,而且我认为非技术人员也应该 ...
最新文章
- c 与matlab混编,谈谈Matlab与C/C++或C#的互调用(混合编程)
- 如何定义一个不能被继承的类
- java toHalf_MoreThanHalfInArray.java
- 第二小节之面向对象上
- (86)FPGA同步复位与异步复位-面试必问(十)(第18天)
- 【网络安全工程师面试】—SSRF服务端请求伪造漏洞及利用方法
- UVA10295 POJ2403 ZOJ1902 Hay Points【map】
- 某大型电商云平台实践
- rs485如何使用_气体检测仪rs485和4-20ma接线方式有什么区别,该如何选择最优的接线方式...
- 长沙开发者技术大会暨.NET技术社区成立大会倒数第13天
- input type=file 的onchange事件
- 调整w7计算机屏幕一直亮,win7系统电脑屏幕不休眠保持常亮状态设置的操作方法...
- Django 表单 AuthenticationFrom自动检测user的name 和 password , has no attributes cleaned_data
- ibm tivoli_使用Tivoli Access Manager的多租户云解决方案中的访问控制最佳实践
- 永中科技的救命恩人是谁?
- 积木拼图游戏-儿童游戏免费拼图3-6岁
- 【AI测试】人工智能测试整体介绍——第七部分
- 大学物理--电磁辐射的量子理论部分
- MyCat分片规则(全局表,ER分片表,多对多关联,主键分片VS非主键分片),MyCat常用的分片规则(15中分片规则),自定义MyCat分片规则,其它术语
- 《Windows CE嵌入式开发入门——基于Xscale架构》 第7章 Windows CE体系结构
热门文章
- 版本交付_连续交付友好的Maven版本
- web.xml.jsf_看一下即将发布的JSF 2.3 Push支持
- mycat和应用程序集成_企业应用程序集成简介
- java 微型数据库_Java 9代码工具:使用Java微型基准测试工具的实践会话
- hibernate性能_改善Hibernate应用程序性能的7种方法
- latex中算法命令_比较Java 8中的命令式和功能性算法
- apache camel_带有调试器的Apache Camel Eclipse工具
- 专业QA如何实施可靠的CI / CD管道?
- 使用Oracle验证外部数据
- Java:使用Mockito模拟ResultSet