简介:

首先我们需要理解什么是依赖注入?
控制反转和依赖注入有什么区别?
假定:应用程序A,需要访问外部资源C。这里使用了容器B(是指用来实现 IOC/DI 功能的一个框架程序)。
A需要访问C
B获取C然后返回给A
IOC inversion of control 控制反转:站在容器角度。B控制A,由B反向的向A注入C。即容器控制应用程序,由容器反向的向应用程序注入应用程序所需要的外部资源。
DI Dependency Injection 依赖注入:站在应用程序的角度。A依赖B获取C,B将C注入A。即应用程序依赖容器创建并注入它所需要的外部资源。
AngularJS依赖注入
Provider服务($provide)
AngularJS 提供很好的依赖注入机制。以下5个核心组件用来作为依赖注入:
value
factory
service
provider
constant
decorator (打酱油)
Constant
定义常量用的,这货定义的值当然就不能被改变,它可以被注入到任何地方,但是不能被装饰器(decorator)装饰
var app = angular.module('app', []);
app.config(function ($provide) {
$provide.constant('movieTitle', 'The Matrix');
});
app.controller('ctrl', function (movieTitle) {
expect(movieTitle).toEqual('The Matrix');
});
// 语法糖:
app.constant('movieTitle', 'The Matrix');
Value
这货可以是string,number甚至function,它和constant的不同之处在于,它可以被修改,不能被注入到config中,但是它可以被decorator装饰
var app = angular.module('app', []);
app.config(function ($provide) {
$provide.value('movieTitle', 'The Matrix')
});
app.controller('ctrl', function (movieTitle) {
expect(movieTitle).toEqual('The Matrix');
});
// 语法糖:
app.value('movieTitle', 'The Matrix');
Service
它是一个可注入的构造器,在AngularJS中它是单例的,用它在Controller中通信或者共享数据都很合适。
var app = angular.module('app' ,[]);
app.config(function ($provide) {
$provide.service('movie', function () {
this.title = 'The Matrix';
});
});
app.controller('ctrl', function (movie) {
expect(movie.title).toEqual('The Matrix');
});
// 语法糖:
app.service('movie', function () {
this.title = 'The Matrix';
});
Factory
它是一个可注入的function,它和service的区别就是:factory是普通function,而service是一个构造器(constructor),这样Angular在调用service时会用new关键字,而调用factory时只是调用普通的function,所以factory可以返回任何东西,而service可以不返回(可查阅new关键字的作用)。
var app = angular.module('app', []);
app.config(function ($provide) {
$provide.factory('movie', function () {
return {
title: 'The Matrix';
}
});
});
app.controller('ctrl', function (movie) {
expect(movie.title).toEqual('The Matrix');
});
// 语法糖
app.factory('movie', function () {
return {
title: 'The Matrix';
}
});
Provider
provider是他们的老大,上面的几乎(除了constant)都是provider的封装,provider必须有一个$get方法,当然也可以说provider是一个可配置的factory。
var app = angular.module('app', []);
app.provider('movie', function () {
var version;
return {
setVersion: function (value) {
version = value;
},
$get: function () {
return {
title: 'The Matrix' + ' ' + version
}
}
}
});
app.config(function (movieProvider) {
movieProvider.setVersion('Reloaded');
});
app.controller('ctrl', function (movie) {
expect(movie.title).toEqual('The Matrix Reloaded');
});
Decorator
这个比较特殊,它不是provider,它是用来装饰其他provider的,而前面也说过,他不能装饰Constant,因为实际上Constant不是通过provider()方法创建的。
var app = angular.module('app', []);
app.value('movieTitle', 'The Matrix');
app.config(function ($provide) {
$provide.decorator('movieTitle', function ($delegate) {
return $delegate + ' - starring Keanu Reeves';
});
});
app.controller('myController', function (movieTitle) {
expect(movieTitle).toEqual('The Matrix - starring Keanu Reeves');
});
总结:
所有的供应商都只被实例化一次,也就说他们都是单例的
除了constant,所有的供应商都可以被装饰器(decorator)装饰
value就是一个简单的可注入的值
service是一个可注入的构造器
factory是一个可注入的方法
decorator可以修改或封装其他的供应商,当然除了constant
provider是一个可配置的factory
上述来源:(AngularJS中的Provider们:Service和Factory等的区别)https://segmentfault.com/a/1190000003096933
注入器($injector)
注入器负责从我们通过 provide 创建的服务中创建注入的实例。只要你编写了一个带有可注入性的参数,你都能看到注入器是如何运行的。每一个 AngularJS 应用都有唯一一个 injector,当应用启动的时候它被创造出来,你可以通过将 injector 注入到任何可注入函数中来得到它($injector 知道如何注入它自己!)。
一旦你拥有了 injector,你可以动过调用 get 函数来获得任何一个已经被定义过的服务的实例。
var movie = $injector.get('movie');
expect(movie.title).toEqual('The Matrix Reloaded');
注入器同样也负责将服务注入到函数中;例如,你可以魔法般的将服务注入到任何函数中,只要你使用了注入器的 invoke 方法:
var myFunction = function(movie) {
return movie.title;
};
$injector.invoke(myFunction);
如果注入器只是创建一个服务的实例一次的话,那么它也没什么了不起的。它的厉害之处在于,他能够通过服务名称缓存从一个 provider 中返回的任何东西,当你下一次再使用这个服务时,你将会得到同一个对象。
因此,你可以通过调用 injector.invike 将服务注入到任何函数中也是合情合理的了。包括:
由于constant和value总是返回一个静态值,它们不会通过注入器被调用,因此你不能在其中注入任何东西。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# AngularJS
# 依赖注入
# angular 服务的单例模式(依赖注入模式下)详解
# 深入理解Angular中的依赖注入
# Angular 4依赖注入学习教程之InjectToken的使用(八)
# Angular 4依赖注入学习教程之ValueProvider的使用(七)
# AngularJS的依赖注入实例分析(使用module和injector)
# 自学实现angularjs依赖注入
# Angular.JS学习之依赖注入$injector详析
# AngularJS $injector 依赖注入详解
# 详解Angular依赖注入
# 是一个
# 你可以
# 应用程序
# 它是
# 它可以
# 都是
# 站在
# 只要你
# 所需要
# 商都
# 他们的
# 使用了
# 都有
# 很好
# 也就
# 将会
# 之处
# 可以说
# 是指
# 当你
相关文章:
如何实现建站之星域名转发设置?
网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?
制作门户网站的参考文献在哪,小说网站怎么建立?
道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?
如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法
安云自助建站系统如何快速提升SEO排名?
如何在阿里云虚拟主机上快速搭建个人网站?
清除minerd进程的简单方法
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
高性能网站服务器部署指南:稳定运行与安全配置优化方案
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
如何快速建站并高效导出源代码?
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
h5在线制作网站电脑版下载,h5网页制作软件?
代刷网站制作软件,别人代刷火车票靠谱吗?
SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?
建站之星如何一键生成手机站?
沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?
深圳 网站制作,深圳招聘网站哪个比较好一点啊?
如何优化Golang Web性能_Golang HTTP服务器性能提升方法
如何通过NAT技术实现内网高效建站?
seo网站制作优化,网站SEO优化步骤有哪些?
建站之星手机一键生成:多端自适应+小程序开发快速建站指南
江苏网站制作公司有哪些,江苏书法考级官方网站?
如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法
内部网站制作流程,如何建立公司内部网站?
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
免费网站制作appp,免费制作app哪个平台好?
建站之星客服服务时间及联系方式如何?
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
建站之星如何修改网站生成路径?
如何制作算命网站,怎么注册算命网站?
如何在阿里云高效完成企业建站全流程?
建站之星如何保障用户数据免受黑客入侵?
制作网页的网站有哪些,电脑上怎么做网页?
潍坊网站制作公司有哪些,潍坊哪家招聘网站好?
如何通过建站之星自助学习解决操作问题?
如何用VPS主机快速搭建个人网站?
高防服务器:AI智能防御DDoS攻击与数据安全保障
零基础网站服务器架设实战:轻量应用与域名解析配置指南
c++怎么用jemalloc c++替换默认内存分配器【性能】
如何快速上传自定义模板至建站之星?
婚礼视频制作网站,学习*后期制作的网站有哪些?
制作农业网站的软件,比较好的农业网站推荐一下?
网站好制作吗知乎,网站开发好学吗?有什么技巧?
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
如何彻底删除建站之星生成的Banner?
黑客入侵网站服务器的常见手法有哪些?
如何用好域名打造高点击率的自主建站?
*请认真填写需求信息,我们会在24小时内与您取得联系。