依赖注入(DI):必须具备三个要素
1、服务注册
2、依赖关系声明
3、对象的获取
在angular中,module 和$provide 相当于是服务的注册。injector用来获取对象。
如何创建获取模块
主要是通过 参数的个数来确定的和区分的
angular.module(模块名, [模块依赖的其他模块列表], [对模块的配置]);
## angular提供了3种获取依赖的方式:inference、annotation、inline方式 ##
$injector 其实是一个IOC容器 包含了很多服务
每个模块只有一个 rootScope,只有一个 injector,但可以有多个$scope 。
由于每个模块的injector是唯一的,所以 angular.element().injector()直接返回元素所在模块的injector 。
五种方法创建服务:
factory service constant value provider
- factory 是用来注册服务的最常见方式,
- factory(name,getFn) 服务名 函数
service 可以注册一个支持构造函数的服务
- service(name,constructor) 名称 构造函数
provider 所有服务工厂都是有provider创建的
- provider负责在$providerCache中注册服务
- 有一个问题是 是否可以一直使用factory 替代privater,答案取决于是否需要用AngularJS的.config()函数来对.provider()方法返回的服务进行额外的扩展配置。同其他创建服务的方法不同,config()方法可以被注入特殊的参数
- 使用.provider()方法,可以在多个应用使用同一个服务时获得更强的扩展性,特别是在不同应用或开源社区之间共享服务时。
- 如果希望在config()函数中可以对服务进行配置,必须用provider()来定义服务
- provider(name,aProvider) aProvider可以是数组、函数、对象
constant(name,value) 可以将一个已经存在的变量值注册为服务,并将其注入到应用的其他部分中。
- constrant(name,value) name常量名字 value常量值
- value(name,value) 如果服务$get方法返回的一一个常量,就没有必要定义一个包含复杂功能的完整服务,可以通过value()函数方便注册。
- name服务名 常量值
何时使用 value 和 constant
value 和 constant之间的区别在于 常量可以注入到配置函数中 而值不行。
通常情况下,可以通过value()来注册服务对象或函数,用constant()来配置数据
注: injector通过调用 get方法创建服务实例
最后提一下 decorator 装饰器 它的功能主要是运用在我们自己的服务上,也可以对angular的核心服务进行拦截、中断甚至替换操作。
调用形式为 decorator(name, decorator);