依赖注入简介(一)

       依赖注入(Injecting dependencies)经常听起来会让人感觉到很难以理解,会让大家感觉这是很复杂的编程技术,但是事实上并不是这样,依赖注入非常方便使用,它会让你的程序非常便于理解,同时也更容易进行测试。

依赖注入的工作方式:

       任何好的程序都是由很多互相协作的类来实现复 杂的逻辑的。在传统的使用方法中,每个对象都会把自己的引用传递给它协作的对象,但是这样会造成对象间的高度耦合,同时不容易对程序进行测试。接下来我们看一个例子:


       从这个例子中,我们可以看出来,DamselRescuingKnight在容器中创造了他自己的 RescueDamselQuest请求,不过这使得DamselRescuingKnight和 RescueDamselQuest紧紧耦合,同时也限制了骑士能做的事情,如果美少女需要救援,骑士可以轻松胜任,但是如果恶龙需要治服,或者...其他各种事情,这时骑士根本无能为力。除此之外,这样的设计也很难去进行测试,在这个例子中当 embarkOnQuest()被调用,又调用到 embark()到时,需要我们在 embark()中插入断点,但是这很难实现,也就是说我们没法很好的测试DamselRescuingKnight的功能。

       耦合是一个双头怪兽,一方面,它高耦合的代码很难测试,很难复用,同时也很难理解。而且它还可能造成whack-a-mole这样的bug(就像我们在打鼹鼠时一样,我们注重一处的代码,可是在其他地方却引发了更多的bug),另一方面,其实一些适当的耦合其实也是有用的,完全的飞耦合让我们很难实现有些功能。为了能够高效的开发,类之间必须能够互相了解, 适当的耦合是必须的,但是必须要控制好这个度。通过使用DI,对象所需要的依赖会在创建时由熟悉各个对象的第三方提供,也就是将每个对象需要的依赖在它在创建时注入给它。接下来我们将看到一个真正全能的骑士,他不仅能够击败邪恶势力拯救美少女,同时也能够下厨做美食,他能够回应你的各种请求。

       如上面所示,BraveKnight并不像DamselRescuingKnight,它不需要创建任何请求,取而代之的是在构造器中或获取它需要的request。这种DI一般被称为constructor injection。不仅如此,上面的quest如果是个接口,那么我们可以实现任何形式的request。

       重点是BraveKnight不需要和任何已实现的Quest耦合,它并不需要去了解这个接口是如何实现的。这就是DI最重要的特性-----低耦合性。这个特性的一个很重要的用途是我们在进行测试时可以可mock掉这个接口。而在高耦合的设计中这很难实现。


       在这里,使用了叫做Mockitode的mock对象framework,通过它,我们可以创造一个实现了Quest接口的mock,利用来实例化BraveKnight,并且通过构造函数注入mockquest,这时我们就可以调用embarkOnQuest()方法,并且去验证embark()是否确实被调用了一次。


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

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

相关文章

Jmeter笔记(Ⅱ)使用Jmeter实现轻量级的接口自动化测试

接口测试虽然作为版本的一环,但是也是有一套完整的体系,有接口的功能测试、性能测试、安全测试;同时,由于接口的特性,接口的自动化低成本高收益的,使用一些开源工具或一些轻量级的方法,在测试用…

依赖注入简介(二)

在上一篇中,我们已经介绍过了最基本的依赖注入,接下来我们来看如何对需要使用的类进行装配。通常应用程序的组件之间的关联是通过wiring,在Spring中同样有很多方式来装配。但是一个最通常我们使用的方法是利用XML。接下来我们来展示一个简单的…

eclipse启动tomcat 访问http://localhost:8080 报404错误

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 eclipse正常启动tomcat,但是 访问http://localhost:8080 却报404错误 修改下配置 就好操作如下图 打开eclipse的server视图&a…

手把手JDK环境变量配置

分为下载,配置,验证三个步骤解释如何进行JDK环境变量配置。 步骤一: 首先查看配置成功后的效果: tip:点击win——>运行(或者使用winr,或者shift鼠标右键打开powershell)——>输入cmd回车——>控制…

myeclipse进入Myeclipse configuration center 如何关闭

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 找到这个图标,放上去显示return即可关闭,隐藏很深有木有

[No0000166]CPU的组成结构及其原理

中央处理器(Central Processing Unit, CPU)CPU的基本架构和工作原理其实百科上讲得已经相当清楚了,不过我觉得有些事情呢还是给个例子出来比较方便学习。本文会先从内存地址,计算机的一般架构之类的基础知识出发,然后逐步为读者"拼装&qu…

Java 时间总结

转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/80613024 本文出自【赵彦军的博客】 时区 整个地球分为二十四时区,每个时区都有自己的本地时间。为了统一起见,使用一个统一的时间,称为通用协调时(UTC, Univer…

4.10/4.11/4.12 lvm讲解 4.13 磁盘故障小案例

2019独角兽企业重金招聘Python工程师标准>>> 准备磁盘分区 fdisk /dev/sdb n 创建三个新分区,分别1G t 改变分区类型为8e 准备物理卷 pvcreate /dev/sdb1 pvcreate /dev/sdb2 pvcreate /dev/sdb3 pvdisplay/pvs 列出当前的物理卷 pvremove /dev/sdb3 删除…

外围功能电路控制 LET′S TRY“嵌入式编程”: 4 of 6

外围功能电路控制 LET′S TRY“嵌入式编程”: 4 of 6本连载讲解作为嵌入式系统开发技术人员所必需具备的单片机的基础知识。 在《单片机入门(1)~(3)》中,我们一起学习了单片机的硬件和编程语言以及开发环境…

如何防止代码腐烂

很多团队都有这个问题,一个项目的代码本来开始设计得好好的,一段时间以后,代码就会变得难以理解,难以维护,难以修改。为什么?我一直在思考这个问题。 让我们先看一个人的情况。 1. 程序员的成长 新手的代码…

git branch 分支

Git自学之路(四)- git branch 分支 几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。 在很多版本控制系统中,这是一个略微低效的过程——常常需要完全创建一…

大数据分析如何创建最佳的移动应用用户体验

2019独角兽企业重金招聘Python工程师标准>>> 如今,越来越多的人使用移动应用程序。而移动应用将在未来成为一个价值数十亿美元的产业。大数据可以帮助企业构建最佳的用户体验。 多年来,开发移动应用程序的技术一直在不断发展,这实…

Jstorm+Spring+mybatis整合

在现有的jstorm框架下,有一个需求:jstorm要对接mysql数据库的实时读取数据, 通过bolt处理,可能要调用service层的框架,最后保存到数据库。 在网上寻找了一下,发现storm集成spring的资料非常少,有…

上海云栖:金融政企行业的CDN最佳实践

2019独角兽企业重金招聘Python工程师标准>>> 摘要: 在刚刚结束的上海云栖大会飞天技术汇分论坛上,阿里云视频云产品架构师罗小飞进行了《阿里云CDN——面向金融政企的CDN最佳实践》主题分享,为上海的嘉宾介绍CDN的解决方案与技术服…

lunix基本命令

安装lunix 批量创建文件 whoami查看当前用户 sudo adduser lilei创建用户 groups lilei 查看用户所属用户组 sudo usermod -G root lilei 赋予root权限 sudo deluser lilei --remove-home ls -l 显示目录的文件 ls -a 显示隐藏文件 PWD 获取当前目录 cd .. 返回上层目录 cd 进入…

开启Swarm集群以及可视化管理

为什么80%的码农都做不了架构师?>>> 在搭建的两台coreos服务器上开启swarm集群 前置条件: docker均开启2375端口同一个局域网内主服务器上安装Portainer容器安装Portainer容器执行: docker run -d -p 9000:9000 --restartalways …

python基本语法:序列

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1. 序列的基本操作: 2.用例: 3.序列包含字符串、元组、列表。

IMDb、烂番茄、MTC、各种电影行业评分名字整理

这篇不是技术文章,就是对总是看到但是不知道具体是什么的一些电影名词、评分、来源,学习一下。 IMDb 互联网电影资料库(Internet Movie Database,简称IMDb)是一个关于电影演员、电影、电视节目、电视明星和电影制作的在…

iOS应用:成功就像中彩票,大半开发者亏本

移动是座大金矿,从来都不乏一飞冲天的成功故事(Draw Something、愤怒的小鸟等)。但是大家往往只看到光鲜的一面,对于移动开发者来说,现实是残酷的,根据市场营销机构App Promo的一项调查,绝大多数…

python基本语法:元组

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1. 元组说明: 元组和列表类似,只不过元组和字符串一样是不可变的,即你不能修改元组。 元组通过圆括…