• 有神论跟无神论的差别在哪你都不知道,还要扯啥呢。 2019-05-19
  • 央行就“金融改革与发展”答记者问 2019-05-10
  • 图书馆·情报与文献学 2019-05-10
  • 以专业认证推进落实管办评分离改革 2019-05-07
  • 投诉可以反投诉的,中国人人平等的。 2019-05-06
  • 寻找三秦非遗:二月二,大荔县阿寿村药王庙会赛花馍 2019-05-06
  • 计划不是产生在交换基础上的计划。 2019-05-05
  • 凤凰公映礼之《闪光少女》 2019-05-04
  • [中国新闻]韩朝军方商定重启陆海军事通信渠道 2019-05-02
  • 庆祝中国人民解放军建军90周年大会在京隆重举行 2019-05-02
  • 昌发展:母基金优势可利于构建一体化产业服务链条 2019-05-01
  • 第523期:土鸡蛋VS洋鸡蛋,哪个好?怎样挑? 2019-04-29
  • 十九大代表、海口市公安局琼山分局飞鹰大队大队长冯晖:把十九大精神讲清楚、讲明白 2019-04-25
  • 即使中美贸易归零,中国也不会屈服美国的大棒政策 2019-04-25
  • 沪上台企搭建创业平台 助力两岸青年文创交流 2019-04-24
  • 神奇公式秒杀全国11选5 www.bjux.net Dependency Injection-依赖注入详解

    1. 神奇公式秒杀全国11选5>
    2. 博客>
    3. 正文

    Dependency Injection-依赖注入详解

    异步社区 2018-04-27 11:58:47 浏览7507 评论0

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

    点击关注?异步图书,置顶公众号

    每天与你分享 IT好书 技术干货 职场知识

    ?参与文末话题讨论,每日赠送异步图书。

    ——异步小编

    依赖注入是目前很多优秀框架都在使用的一个设计模式。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组件的设计过程。

    假设我们要开发一套组件,这个组件干啥目前并不重要,不过它需要连接数据库。最简单的实现,当然是把数据库的配置信息写在组件里面。

    9ccc0ca9gy1fqr2f3hdekj20he08wmxh.jpg

    ?但是这么干问题很大,属于“代码的坏味道”。因为数据库配置写死了,完全没有灵活性可言。这也给后面的测试/部署/安全带来了隐患。为了解决这个问题,我们试试把配置信息拿出去,从外面传进来。

    9ccc0ca9gy1fqr2fgwhwbj20hd0ahmxl.jpg

    ?好一点。不过如果我们在很多地方都要用这个组件,那么意味着每次用的时候,都要创建这么一个连接配置对象,不仅冗余,而且难以变更和管理。我们把这个连接配置对象单独放在一个地方管理,DRY原则。

    9ccc0ca9gy1fqr2fz4507j20ha0el0th.jpg

    ?可行。不过有个问题,连接对象每次使用都是重复创建,浪费资源。再改一下,改成共享式,近似于单件模式。

    9ccc0ca9gy1fqr2g6o7w2j20hm0rmdho.jpg

    ?这就是“依赖注入”模式了,它解决了组件的依赖项和组件之间的过度耦合问题。不过还有个麻烦:如果这个组件依赖项很多怎么办?每次都要创建并设置一大堆依赖项。

    9ccc0ca9gy1fqr2gn03jrj20hf05qjrr.jpg

    ?每次使用这个组件,都要创建一堆附加的依赖项。如果以后我们修改组件依赖,那么必须挨个改掉。代码的坏味道又来了。再改。

    9ccc0ca9gy1fqr2gwqfybj20hc06g74j.jpg

    ?

    估计好多人走到这一步就会停下脚步了。代码用个工厂模式不就行了嘛??墒悄愣员认驴返拇?,组件和它的依赖项的耦合不就又来了么?现在,问题又回到开头了。

    一个更好的办法是使用依赖注入容器。它就如同一个全局的注册表,像桥一样获取依赖项,并解耦。

    9ccc0ca9gy1fqr2hrt7b5j20ha0m5abj.jpg

    ?

    问题解决?;袢∫览迪钪灰ü鼶I容器接口操作,不需要的部分甚至都不会创建,节约了资源。

    在Java的Spring框架里面,依赖注入和控制反转设计思想是近似的,道理相同但是实现不同。因为编程语言各有各的设计特点可以利用。

    Spring框架的依赖注入容器接口是:ApplicationContext.?

    9ccc0ca9gy1fqr2i2pq75j20hc014mx0.jpg

    ?

    但是Spring使用DI,有好几种方法,比如注解式,利用了语言的功能。

    具体解释参考这篇文章,不翻译了。

    Intro to Inversion of Control and Dependency Injection with Spring

    本文摘自:异步社区,作者:?winston?作品《Dependency Injection-依赖注入详解》?

    ?

    9ccc0ca9gy1fqr1p8hddyg20hs01pq2s.gif

    推荐阅读

    2018年4月新书书单

    异步图书最全Python书单

    一份程序员必备的算法书单

    第一本Python神经网络编程图书

    ?

    9ccc0ca9gy1fqp72lxztpj209k09k744.jpg

    ?长按二维码,可以关注我们哟

    每天与你分享IT好文。


    在“异步图书”后台回复“关注”,即可免费获得2000门在线视频课程;推荐朋友关注根据提示获取赠书链接,免费得异步e读版图书一本。赶紧来参加哦!

    点击阅读原文,查看更多

    ?阅读原文

    【云栖快讯】阿里巴巴小程序繁星计划,20亿补贴第一弹云应用立即开通购买,限量从速!  详情请点击

    网友评论

  • 有神论跟无神论的差别在哪你都不知道,还要扯啥呢。 2019-05-19
  • 央行就“金融改革与发展”答记者问 2019-05-10
  • 图书馆·情报与文献学 2019-05-10
  • 以专业认证推进落实管办评分离改革 2019-05-07
  • 投诉可以反投诉的,中国人人平等的。 2019-05-06
  • 寻找三秦非遗:二月二,大荔县阿寿村药王庙会赛花馍 2019-05-06
  • 计划不是产生在交换基础上的计划。 2019-05-05
  • 凤凰公映礼之《闪光少女》 2019-05-04
  • [中国新闻]韩朝军方商定重启陆海军事通信渠道 2019-05-02
  • 庆祝中国人民解放军建军90周年大会在京隆重举行 2019-05-02
  • 昌发展:母基金优势可利于构建一体化产业服务链条 2019-05-01
  • 第523期:土鸡蛋VS洋鸡蛋,哪个好?怎样挑? 2019-04-29
  • 十九大代表、海口市公安局琼山分局飞鹰大队大队长冯晖:把十九大精神讲清楚、讲明白 2019-04-25
  • 即使中美贸易归零,中国也不会屈服美国的大棒政策 2019-04-25
  • 沪上台企搭建创业平台 助力两岸青年文创交流 2019-04-24
  • 三d开奖号码 新浪nba篮彩预测 新彩网是3d字谜图迷 极速飞艇软件下载 中国竞彩网址 联众德州扑克 pk10两期免费计划app 北单直播 七乐彩走势图带坐标带连线 乐透乐博彩论坛 最新时时彩销量排行榜 足彩胜负彩奖池 14场胜负彩中几场有奖 手机北京快乐8看盘软件 广东快乐十分开奖直播 北京赛车杀号公式