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

依赖注入通俗解释

最近,我们公司开始开发一个新的基于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/354839.shtml

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

相关文章

session cookie

http://www.cnblogs.com/andy-zhou/p/5360107.html&#xff08;牛逼网址&#xff09; http://www.cnblogs.com/shiyangxt/archive/2008/10/07/1305506.html&#xff08;同款牛逼&#xff09; cookie: session: Session是另一种记录客户状态的机制&#xff0c;不同的是Cookie保存…

C语言程序设计二期末考试,9第二学期期末考试《C语言程序设计》A

期末试题 二级c语言………………………………装………………………………订…………………………………线………………………………安徽工业大学题纸(一)2009~2010学年第一学期期末考试《C程序设计(2)》试卷 A考试时间&#xff1a;120分钟满分&#xff1a;100分(作题答案一律写…

SWT ScrolledComposite解释

就像我的一个朋友曾经说过的那样&#xff0c;SWT的ScrolledComposite是令人讨厌的野兽。 在某种程度上&#xff0c;我同意。 这可能是为什么有太多关于如何使用此小部件的问题的原因。 但不仅是ScrolledComposite的作者受到了谴责。 当某个软件无法按您预期的方式工作时&#…

c语言中变量的值十进制,C语言中介绍的整型变量 即十进制 十六进制什么的是什么意思 能具体解释一下吗 还有换算什么的 谢谢...

二进制.八进制.十进制.十六进制.编程序时不需要换算。输入的时候八进制%o十六进制%x十进制%d在计算机都一样是二进制&#xff0c;不影响计算&#xff0c;不存在转换问题。输出的时候&#xff0c;同理用%o,%d,%x输出相应的进制。(0.56)85*8-16*8-2(0.71875)10(12A)161*1622*161A…

大数相加c语言思路,大数相加

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include #include /**** 定义双向节点* 数据区为一个整型数字***/struct Node {int number;//数据区&#xff0c;仅一个数字&#xff0c;保存一位数字struct Node * next;struct Node * prev;};typedef struct Node Node;/*** 创建…

关联关系、依赖关系总结

一、关联关系总结&#xff1a; 1.对象和对象之间的连接。在Java中&#xff0c;关联关系的代码表现形式为一个类做为另一个类的属性类型存在。即“有”的关系&#xff1a;”has-a”。 2.关联关系的方向&#xff1a;关联关系分为单向关联和双向关联 ①单向关联&#xff1a; A类…

使用cglib创建代理对象

在上一篇文章中&#xff0c;我讨论了基于标准Java的代理对象。 当您要在实现接口的对象上具有方法调用处理程序时&#xff0c;可以使用这些方法。 Java反射代理的创建要求您具有一个实现接口的对象。 我们要代理的对象已经失控&#xff0c;它没有实现我们要从处理程序调用的接口…

四阶龙格库塔c语言,四阶龙格库塔算法的C语言实现

解微分方程&#xff12;&#xff10;&#xff10;&#xff11;年&#xff13;月焦作大学学报&#xff2a;&#xff2f;&#xff35;&#xff32;&#xff2e;&#xff21;&#xff2c;&#xff2f;&#xff26;&#xff2a;&#xff29;&#xff21;&#xff2f;&#xff3a;&a…

8个超震撼的HTML5和纯CSS3动画源码

HTML5和CSS3之所以强大&#xff0c;不仅因为现在大量的浏览器的支持&#xff0c;更是因为它们已经越来越能满足现代开发的需要。Flash在几年之后肯定会消亡&#xff0c;那么HTML5和CSS3将会替代Flash。今天我们要给大家分享8个最新的HTML5和纯CSS3动画及其源码&#xff0c;这些…

c语言打砖块游戏代码,打砖块游戏的源代码(请多指教)

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include#include#include#include#includevoid draw(int x1){int m0,n0,x40,y20;int t0,i,j,k1;int a0,b127,c88;for(i0;i<8;i){ni*20;yn20;for(j0;j<16-t;j){m(ji)*40;xm40;int points[]{m,n,x,n,x,y,m,y}; setfillstyle(R…

git本地创建新分支并推送到远程仓库

1,在当前项目目录&#xff0c;从已有的分支创建新的分支(如从master分支),创建一个dev分支 git checkout -b dev 2,创建完可以查看一下,分支已经切换到dev git branch * dev master 3,提交该分支到远程仓库 git push origin dev 4,测试从远程获取dev git pull origin dev 5,我觉…

javadoc 开源项目_在下一个项目中不使用JavaDoc的5大原因

javadoc 开源项目JavaDoc对于框架和库的开发是绝对必需的&#xff0c;这些框架和库为其他框架&#xff08;例如Spring Framework&#xff0c;JDK&#xff09;提供了公共接口。 对于内部企业软件和/或产品开发&#xff0c;我有以下原因会在将来忽略“ 100&#xff05;JavaDoc Po…

android拍照功能无预览,Android 无预览拍照

最近得到了一个需求&#xff0c;在后台拍照并保存public void onTakePhotoClicked() {final SurfaceView preview new SurfaceView(this);SurfaceHolder holder preview.getHolder();// deprecated setting, but required on Android versions prior to 3.0holder.setType(Su…

vim选中字符复制/剪切/粘贴

问题描述&#xff1a; vim 中选中指定字符&#xff0c;进行复制/剪切/粘贴 问题解决&#xff1a; 进入vim中visual模式&#xff0c;visual模式进入&#xff0c;可以有三种方式&#xff1a; &#xff08;1&#xff09;在普通模式&#xff08;normal&#xff09;下&#xf…

使用JavaFX构建反应系统

JavaFX是用于在Java中构建图形应用程序的新标准库&#xff0c;但是许多程序员仍然对Swing甚至&#xff08;高音&#xff09;AWT感到困惑。 在Java诞生20年来&#xff0c;发生了很多事情。 两年前&#xff0c;当我开始研究Speedment UI的JavaFX库时&#xff0c;发现很多东西很着…

android中访问手机存储空间,android – 访问手机内部存储以推入SQLite数据库文件...

我正在使用Netbeans和java开发我的android应用程序.当我使用模拟器时,我可以通过访问以下路径,data / data / com.example.helloandroid / database来访问File explorer并将SQLite数据库插入设备内部存储器但是当我使用真实设备时,我无法访问此位置以将SQLite文件推送到手机的内…

Spring中@Autowired注解、@Resource注解的区别

Spring不但支持自己定义的Autowired注解&#xff0c;还支持几个由JSR-250规范定义的注解&#xff0c;它们分别是Resource、PostConstruct以及PreDestroy。Resource的作用相当于Autowired&#xff0c;只不过Autowired按byType自动注入&#xff0c;而Resource默认按 byName自动注…

android中白色怎么表示,通知栏图标在android 5中变成白色

接受的答案不完全正确。当然&#xff0c;它会使通知图标显示颜色&#xff0c;但是这样做有一个很大的缺点-将目标SDK设置为比AndroidLolliop低&#xff01;如果您按照建议将目标SDK设置为20来解决您的白色图标问题&#xff0c;您的应用程序将不会针对AndroidLolliop&#xff0c…

Merge Sorted Array

这是一道我觉得有点不是很好的简单题 题目&#xff1a; Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note:     You may assume that nums1 has enough space (size that is greater or equal to m n) to hold additi…

阿里巴巴android图标素材网,阿里巴巴矢量图标库

网站简介&#xff1a;IconFont:阿里巴巴矢量图标库是由阿里巴巴体验团队倾力打造的中国第一个最大且功能最全的矢量图标库&#xff0c;提供矢量图标下载、在线存储、格式转换等功能&#xff0c;是设计师和前端开发的便捷工具。IconFont平台是由阿里巴巴UX部门推出的矢量图标管理…