点击关注异步图书,置顶公众号python
天天与你分享 IT好书 技术干货 职场知识程序员
参与文末话题讨论,每日赠送异步图书。算法
——异步小编spring
依赖注入是目前不少优秀框架都在使用的一个设计模式。Java的开发框架如Spring在用,PHP的Laravel/Phalcon/Symfony等也在用。好多不一样语言的框架,设计思想大同小异,相互借鉴参考。熟悉了一个语言的开发框架,其它不一样的框架甚至不一样语言的开发框架,每每也很容易从设计理念和概念上理解。不过,有些语言由于设计特点,一些设计模式反而看似消失不见了。实际上是融入了语言里面,不易察觉。我看见过这么一句话:“设计模式是编程语言固有缺陷的产物”。有一个讨论在这里:Why is IoC / DI not common in Python?数据库
Dependency Injection 经常简称为:DI。它是实现控制反转(Inversion of Control – IoC)的一个模式。有一本依赖注入详解的书在这里:Dependency Injection 。它的本质目的是解耦,保持软件组件之间的松散耦合,为设计开发带来灵活性。编程
这里借用一套PHP代码的演化过程,解释依赖注入模式的出现过程。代码来自Phalcon框架文档。我的感受,从演化出发,最能达成理解的目标,就如同数学推理同样让人信服,天然而然。想当年,我研究Windows时代的COM技术体系,看到有一本书也是这么作的 – Dan Box的《COM本质论》第1-2章,阐述了从Dll到COM组件的设计过程。设计模式
假设咱们要开发一套组件,这个组件干啥目前并不重要,不过它须要链接数据库。最简单的实现,固然是把数据库的配置信息写在组件里面。安全
可是这么干问题很大,属于“代码的坏味道”。由于数据库配置写死了,彻底没有灵活性可言。这也给后面的测试/部署/安全带来了隐患。为了解决这个问题,咱们试试把配置信息拿出去,从外面传进来。网络
好一点。不过若是咱们在不少地方都要用这个组件,那么意味着每次用的时候,都要建立这么一个链接配置对象,不只冗余,并且难以变动和管理。咱们把这个链接配置对象单独放在一个地方管理,DRY原则。框架
可行。不过有个问题,链接对象每次使用都是重复建立,浪费资源。再改一下,改为共享式,近似于单件模式。
这就是“依赖注入”模式了,它解决了组件的依赖项和组件之间的过分耦合问题。不过还有个麻烦:若是这个组件依赖项不少怎么办?每次都要建立并设置一大堆依赖项。
每次使用这个组件,都要建立一堆附加的依赖项。若是之后咱们修改组件依赖,那么必须挨个改掉。代码的坏味道又来了。再改。
估计好多人走到这一步就会停下脚步了。代码用个工厂模式不就好了嘛。但是你对比下开头的代码,组件和它的依赖项的耦合不就又来了么?如今,问题又回到开头了。
一个更好的办法是使用依赖注入容器。它就如同一个全局的注册表,像桥同样获取依赖项,并解耦。
问题解决。获取依赖项只要经过DI容器接口操做,不须要的部分甚至都不会建立,节约了资源。
在Java的Spring框架里面,依赖注入和控制反转设计思想是近似的,道理相同可是实现不一样。由于编程语言各有各的设计特色能够利用。
Spring框架的依赖注入容器接口是:ApplicationContext.
可是Spring使用DI,有好几种方法,好比注解式,利用了语言的功能。
具体解释参考这篇文章,不翻译了。
Intro to Inversion of Control and Dependency Injection with Spring
本文摘自:异步社区,做者: winston 做品《Dependency Injection-依赖注入详解》
推荐阅读
长按二维码,能够关注咱们哟
天天与你分享IT好文。
在“异步图书”后台回复“关注”,便可免费得到2000门在线视频课程;推荐朋友关注根据提示获取赠书连接,免费得异步e读版图书一本。赶忙来参加哦!
点击阅读原文,查看更多