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

最近,我们公司开始开发基于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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372608.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

可以添加自定义的Select控件

1.控件dom <select name"WebSiteTarget" id"WebSiteTarget" class"w1" onchange"editable2(this);"><option value"-1">请选择城市</option><option>福州</option><option>厦门</op…

innodb_io_capacity =innodb_lru_scan_depth*inoodb_buffer_pool_instances。与 checkpoint

innodb_lru_scan_depth:每个缓冲池刷脏页的能力 innodb_io_capacity: iops inoodb_buffer_pool_instances8 :缓冲池的个数 .关系&#xff1a; innodb_io_capacity > innodb_lru_scan_depth * inoodb_buffer_pool_instances 转载于:https://www.cnblogs.com/zengkefu/…

Java中的责任链模式

当应有几个处理器来执行某项操作并为这些处理器定义特定顺序时&#xff0c;就需要采用责任链设计模式。 在运行时处理器顺序的可变性也很重要。模式的UML表示如下&#xff1a; 处理程序定义处理器对象的一般结构。 这里的“ HandleRequest”是抽象处理器方法。 处理程序还具有自…

php的excel源码下载,PHPExcel-5 - 源码下载|Windows编程|其他小程序|源代码 - 源码中国...

文件名大小更新时间PHPExcel02019-05-11PHPExcel\.gitattributes702019-01-02PHPExcel\.gitignore1082019-01-02PHPExcel\.travis.yml5122019-01-02PHPExcel\16329.xlsx510662019-05-11PHPExcel\19093.xlsx511932019-05-11PHPExcel\43877.xlsx530952019-05-11PHPExcel\62045.xl…

使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(六)-- 依赖注入

本篇将介绍Asp.Net Core中一个非常重要的特性&#xff1a;依赖注入&#xff0c;并展示其简单用法。 第一部分、概念介绍 Dependency Injection&#xff1a;又称依赖注入&#xff0c;简称DI。在以前的开发方式中&#xff0c;层与层之间、类与类之间都是通过new一个对方的实例进行…

基于JAX-WS的webService开发实例

最近因为工作原因接触到webService&#xff0c;所以记录下开发中碰到的问题&#xff0c;方便自己以后复习&#xff0c;顺便发扬一下开源精神。刚刚接触webServie如果有什么错误欢迎大家指正。 本地环境&#xff1a;myEclipse10.6 tomcat7 JDK7 jaxws-ri-2.2.10 第一步&#xff…

完整的WebApplication JSF EJB JPA JAAS –第2部分

视图–创建和JSF设置 本教程是第1部分的继续。 让我们创建一个新的Dynamic Web Project 。 如下图所示创建它&#xff1a; 注意&#xff1a;在某些时候&#xff0c;Eclipse会询问您是否要添加JSF功能&#xff08;自动完成&#xff09;&#xff0c;然后启用它。 就像下面的屏幕…

lempel ziv matlab,基于Python的LempelZiv算法的熵估计

此函数允许估计时间序列的熵。它基于Lempel-Ziv压缩算法。对于长度为n的时间序列&#xff0c;熵估计为&#xff1a;E(1/n和L_i)^-1 ln(n)式中&#xff0c;L逯i是从位置i开始的最短子串的长度&#xff0c;该子串之前没有从位置1出现到i-1。当n接近无穷大时&#xff0c;估计的熵收…

Android使用绘图Path总结

Path作为Android中一种相对复杂的绘图方式&#xff0c;官方文档中的有些解释并不是很好理解&#xff0c;这里作一个相对全面一些的总结&#xff0c;供日后查看&#xff0c;也分享给大家&#xff0c;共同进步。 1.基本绘图方法 addArc(RectF oval, float startAngle, float swee…

2017.3.23下午

下午通过对OSPF基本原理进一步的学习&#xff0c;对上午学习的内容进行了复习。 转载于:https://www.cnblogs.com/bgd140206206/p/6606192.html

编写Eclipse插件教程–第1部分

Eclipse是三个最受欢迎的Java开发IDE之一。 其成功的原因之一是其可扩展性。 对于任何知道该怎么做并且已经做到的人来说&#xff0c;编写eclipse插件都可以非常轻松快捷。 不幸的是&#xff0c;第一次在Eclipse中进行操作可能会非常耗时且令人沮丧。 Eclipse框架非常庞大&…

简单Window下 Android Studio的安装

&#xff08;1&#xff09;首先安装JDK 下载JDK 本人觉得官方网站下JDK比较慢&#xff0c;可以直接百度JDK&#xff0c;&#xff08;如果是64位 百度搜索记得64位&#xff09; 类似于这样的下载 安装可以看下教程&#xff0c;包括环境变量的配置 如何安装JDK &#xff08;2&…

日期处理一之NSLalendar的使用

一、日期和时间模式 日期和时间格式由日期和时间模式字符串组成&#xff0c;在日期和时间模式字符串中未加引号的A到‘Z’和a到‘z’被解释为模式字母&#xff0c;用来表示日期或时间。字符串元素&#xff0c;文本可以使用单引号&#xff08;‘’&#xff09;引起来使用。定义以…

java的使用Pair要导入什么包,第三方jar包的使用

被导入的外部类所在源文件通常要打包成jar包&#xff0c;java中的jar文件装的是 .class 文件。它是一种压缩格式和zip兼容&#xff0c;被称为jar包。JDK提供的许多类&#xff0c;也是以jar包的形式提供的。在用的时候呢&#xff0c;你的文件里有很多个类&#xff0c;把这些类和…

十大最受欢迎的新Eclipse插件

Eclipse Marketplace仍然是发现有趣且相关的Eclipse插件的地方。 通过Eclipse Marketplace客户端&#xff0c;每月成功安装100,000多个基于Eclipse的产品。 我们提供了过去30天 以来所有时间最受欢迎的插件列表。 我认为看看过去12个月中最受欢迎的新插件会很有趣。 以下列出了…

在桌面显示我电脑

打开Windows PowerShell&#xff08;一个像是命令提示符的东西[蓝底白字]&#xff0c;但不是命令提示符&#xff09;&#xff0c;在Windows PowerShell内输入cmd回车&#xff0c;当返回如下信息&#xff1a; Microsoft Windows [版本 6.2.9200](c) 2012 Microsoft Corporation。…

《Java技术》第二次作业计科1501赵健宇

&#xff08;一&#xff09;学习总结 1.使用Eclipse关联jdk源代码,查看String类的equals&#xff08;&#xff09;方法 equals&#xff08;&#xff09;方法截图 “”比较的是地址。equals方法他同样使用号进行内存地址的比较。但是equals方法重写如果号比较不相等&#xff0c;…

注射php,UPDATE注射(mysqlphp)的两个模式

一.测试环境&#xff1a;OS:Windowsxpsp2php:php4.3.10(mysql4.1.9apache1.3.33二.测试数据库结构&#xff1a;-----start-----数据库:test----------------------------------------------------------------表的结构userinfo--CREATETABLEuserinfo(groudidvarchar(12)NOTNULL…

JUnit的内置Hamcrest Core Matcher支持

在用JUnit和Hamcrest改进assertEquals的文章中&#xff0c;我简要讨论了Hamcrest “ 核心 ”匹配器与JUnit的现代版本“结合”在一起的情况。 在那篇文章中&#xff0c;我特别关注了JUnit的assertThat&#xff08;T&#xff0c;Matcher&#xff09;静态方法与Hamcrest核心is()匹…

FormsAuthentication使用指南,实现登录

一般情况下&#xff0c;在我们做访问权限管理的时候&#xff0c;会把用户的正确登录后的基本信息保存在Session中&#xff0c;以后用户每次请求页面或接口数据的时候&#xff0c;拿到Session中存储的用户基本信息&#xff0c;查看比较他有没有登录和能否访问当前页面。Session的…