最近,我们公司开始开发基于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. 依赖注入通俗解释_我如何向团队解释依赖注入

    依赖注入通俗解释 最近,我们公司开始开发一个新的基于Java的Web应用程序,经过一些评估过程,我们决定使用Spring. 但是许多团队成员并不了解Spring和Dependency Injectio ...

  2. 如何用最简单的方式解释依赖注入?依赖注入是如何实现解耦的?

    第一章:小明和他的手机 从前有个人叫小明 小明有三大爱好,抽烟,喝酒-- 咳咳,不好意思,走错片场了.应该是逛知乎.玩王者农药和抢微信红包 小明的三大爱好 我们用一段简单的伪代码,来制造一个这样的小明 ...

  3. 依赖注入?依赖注入是如何实现解耦的?

    如何用最简单的方式解释依赖注入?依赖注入是如何实现解耦的? 第一章:小明和他的手机 从前有个人叫小明 小明有三大爱好,抽烟,喝酒-- 咳咳,不好意思,走错片场了.应该是逛知乎.玩王者农药和抢微信红包 ...

  4. 【C#|.NET】从控制反转(依赖注入)想到事件注入 (非AOP)

    前文 事件注入的想法是由依赖注入所联想到 依赖注入不算什么吸引人的话题 本篇就不详说了 不过有闲暇时间的机会不妨按照自己的兴趣去摸索.研究一些东西,也是一种乐子. 在抓虫系列里简单的描述一下依赖注入在 ...

  5. 在MVC3项目中结合NInject实现依赖注入

    解释: 依赖注入:(Dependency Injection),也称之为控制反转. 大致意思就是,让我们的应用程序所依赖的一些外部服务,可以根据需要动态注入,而不是预先在应用程序中明确的约束.这种思想 ...

  6. dagger2 注入_如何使用Dagger 2在您的应用程序中实现依赖注入

    dagger2 注入 Kriptofolio应用程序系列-第4部分 (Kriptofolio app series - Part 4) Dependency injection will signif ...

  7. python 依赖注入_Dependency Injection-依赖注入详解

    依赖注入是目前很多优秀框架都在使用的一个设计模式.Java的开发框架如Spring在用,PHP的Laravel/Phalcon/Symfony等也在用.好多不同语言的框架,设计思想大同小异,相互借鉴参 ...

  8. Spring的控制反转(IOC)和依赖注入(DI)具体解释

    Spring的控制反转(IOC)和依赖注入(DI)具体解释 首先介绍下(IOC)控制反转: 所谓控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的.这样控制器就有应 ...

  9. 简单解释什么是 依赖注入 和 控制反转

    简单解释什么是 依赖注入 和 控制反转 2017-07-09 关于 依赖注入 与 控制反转 的概念有些人觉得很难理解,最近在给别人讲这个概念的时候梳理了一个比较好理解的解释,而且我认为非技术人员也应该 ...

最新文章

  1. c 与matlab混编,谈谈Matlab与C/C++或C#的互调用(混合编程)
  2. 如何定义一个不能被继承的类
  3. java toHalf_MoreThanHalfInArray.java
  4. 第二小节之面向对象上
  5. (86)FPGA同步复位与异步复位-面试必问(十)(第18天)
  6. 【网络安全工程师面试】—SSRF服务端请求伪造漏洞及利用方法
  7. UVA10295 POJ2403 ZOJ1902 Hay Points【map】
  8. 某大型电商云平台实践
  9. rs485如何使用_气体检测仪rs485和4-20ma接线方式有什么区别,该如何选择最优的接线方式...
  10. 长沙开发者技术大会暨.NET技术社区成立大会倒数第13天
  11. input type=file 的onchange事件
  12. 调整w7计算机屏幕一直亮,win7系统电脑屏幕不休眠保持常亮状态设置的操作方法...
  13. Django 表单 AuthenticationFrom自动检测user的name 和 password , has no attributes cleaned_data
  14. ibm tivoli_使用Tivoli Access Manager的多租户云解决方案中的访问控制最佳实践
  15. 永中科技的救命恩人是谁?
  16. 积木拼图游戏-儿童游戏免费拼图3-6岁
  17. 【AI测试】人工智能测试整体介绍——第七部分
  18. 大学物理--电磁辐射的量子理论部分
  19. MyCat分片规则(全局表,ER分片表,多对多关联,主键分片VS非主键分片),MyCat常用的分片规则(15中分片规则),自定义MyCat分片规则,其它术语
  20. 《Windows CE嵌入式开发入门——基于Xscale架构》 第7章 Windows CE体系结构

热门文章

  1. 版本交付_连续交付友好的Maven版本
  2. web.xml.jsf_看一下即将发布的JSF 2.3 Push支持
  3. mycat和应用程序集成_企业应用程序集成简介
  4. java 微型数据库_Java 9代码工具:使用Java微型基准测试工具的实践会话
  5. hibernate性能_改善Hibernate应用程序性能的7种方法
  6. latex中算法命令_比较Java 8中的命令式和功能性算法
  7. apache camel_带有调试器的Apache Camel Eclipse工具
  8. 专业QA如何实施可靠的CI / CD管道?
  9. 使用Oracle验证外部数据
  10. Java:使用Mockito模拟ResultSet