angular.js - 如何理解依赖注入?
PHP中文网
PHP中文网 2017-05-15 16:51:13
0
12
1296

网上搜了一下,感觉还是不能理解

PHP中文网
PHP中文网

认证0级讲师

全部回复(12)
淡淡烟草味

依赖注入:程序运行过程中,如需另一个对象协作(调用它的方法、访问他的属性)时,无须在代码中创建被调用者,而是依赖于外部容器的注入

下面这个例子可能更加有趣

理解依赖注入:

一个人(Java实例,调用者)需要一把斧子(Java实例,被调用者)

在原始社会里,几乎没有社会分工;需要斧子的人(调用者)只能自己去磨一把斧子(被调用者);对应情形为:Java程序里的调用者自己创建被调用者,通常采用new关键字调用构造器创建一个被调用者

进入工业社会,工厂出现了,斧子不再由普通人完成,而在工厂里被生产出来,此时需要斧子的人(调用者)找到工厂,购买斧子,无须关心斧子的制造过程;对应简单工厂设计模式,调用者只需定位工厂,无须管理被调用者的具体实现

进入“共产主义”社会,需要斧子的人甚至无须定位工厂,“坐等”社会提供即可;调用者无须关心被调用者的实现,无须理会工厂,等待Spring依赖注入

总之依赖注入的意思是你需要的东西不是由你创建的,而是第三方,或者说容器提供给你的。这样的设计符合正交性,即所谓的松耦合。

伊谢尔伦

个人理解,依赖注入是调用者仅通过声明某个组件就可以获得组件的控制权,而对该组件的依赖关系管理、查找、加载由外部完成。

AngularJS中是由$injector进行这项工作。
比如,我在一个服务中注入了$http,并用hehe进行调用:

.service('myService',['$http',function(hehe) {
    this.getUserActivities = function(username){
        return hehe({
            method: 'JSONP',
            url:'https://api.github.com/users/'+username+'/events?callback=JSON_CALLBACK'
        });
    }
}])
洪涛

依赖注入就是你不用关心对象的生命周期,什么时候被创建,什么时候销毁,只需直接使用即可,对象的生命周期由提供依赖注入的框架来管理。

世界只因有你

我补充一点:关于依赖注入和控制反转其实是一个概念的。
@Wang_Bourne

http://www.cnblogs.com/kinglongdai/p/3269049.html
慕课网:http://www.imooc.com/video/4907

刘奇

理论上理解总是有点谈玄论道的感觉 推荐你看一些依赖注入的开源框架 比如RoboGuice 实践出真知
sorry 走错门了 没有看分类 RoboGuice是android的框架 不过道理是一样的

巴扎黑

依赖注入(Dependency Injection,DI)也叫也被称为反转控制(Inversion of Control, IoC),即将类和类、方法和方法之间的关系通过第三方(如配置文件)进行“注入”,不需要类或类方法自己去解决彼此间的调用关系。传统应用程序通常是在类内部执行代码中主动创建这个类所依赖的其它对象,从而导致类与类之间发生紧密耦合,使得类难于测试和隔离,最终导致系统的扩展和维护异常困难。依赖注入用来解决组件之间依赖关系、配置及生命周期管理,通过转移对象控制权,可以解决类之间的耦合问题,对象与对象之间是松散耦合关系,更重要的是使得应用程序体系结构变得非常灵活,很好的体现了面向对象的设计法则之一—依赖设计原则,即著名的好莱坞原则:“Don’t call us, we’ll call you.(不要调用我们,我们会调用你)。

習慣沉默

angular.js 里面就很多这种思想。

包括 var net = require('net');

都酱紫的。

Peter_Zhu

依赖注入

其实就是说目前的对象所具有的特征属性是依赖外部注入的对象的来决定的。
好比你家开个制鞋厂, 有个生产鞋的方法 make。

function shoes() {
    this.make = function() {
        ....
    }  
}

由于市场需要,有一些大牌运动鞋公司需要你们家工厂代工生产,会给你一大包原材料,你们工厂拿到原材料生产,然后贴牌即可。

    function shoes(material) {
        this.material = material;
        this.make = function() {
            ....
        }
    }

这样,如果是 nike 需要你代工,给你 nike 家的材料对象,你就可以生产出 nike 家的运动鞋,adidas 家给你他们家的材料,你就可以生产出他们家的鞋子。

也就是你们家鞋厂生产的鞋子到底是 A 家还是 N 家的鞋子,是依赖于提供你材料的是 A 家还是 N 家。

刘奇

在面向对象编程中,我们经常处理处理的问题就是解耦,程序的耦合性越低表明这个程序的可读性以及可维护性越高。控制反转(Inversion of Control或IoC)就是常用的面向对象编程的设计原则,使用这个原则我们可以降低耦合性。其中依赖注入是控制反转最常用的实现。

具体访问说说依赖注入

为情所困

非常简单的个人理解,依赖注入其实并不难,是一件很自然的事情,现实生活其实比程序难:
依赖注入:你是一个人,你要去打猎,需要一把枪, 这个时候有两个选择,第一个选择,你自己去造,显然不可取,这就是强耦合。第二个选择,你去商店里面买,这就是依赖注入因为是从外面注入给你的通过买,解除自己造的难题,通过注入,解除依赖。多简单的事啊。
控制反转准则:依赖于抽象,而不要依赖于具体的东西, 你去买枪的时候,你的脑海中要有这个枪的抽象概念,你只需要告诉枪店老板,这个枪在你脑海中的抽象形象就可以了。而且你是神创造的,神要测试一下你这个猎人的时候,神如果要给你去创造一把枪就比较麻烦,但是如果你的袋子里面有一张枪的说明书,那就好办了,神分分钟帮你弄出一把枪来。说得更土一点,不要去依赖具体的枪,而要去依赖枪的说明书,这就是控制反转准则。很显然,现实生活中,我们就是这样去干的。
容器:相当于现实生活中的一个超级厉害的工厂,神(程序员)负责不断的给他升级,一般都是bind, 你告诉他什么,他都可以帮你生产,然后再免费送给你。所有的脏活累活,工厂都帮你干了,所在而你只负责在一边,享受生活。这个工厂,是实现依赖注入的难度所在。

再进一步的理解,依赖注入,就等于,共产主义社会。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!