上一篇讲了Angular 依赖注入之注解
这里会介绍 Angular 的注入器和实例化过程,基于 angular@4.1.0-beta.1
Angular 依赖注入过程主要有下面几个重要的部分组成:
Inject 和 Injectable 装饰器解析提供商,构造注入器获取实例化对象
Angular 依赖注入中的一些重要的概念:
Provider :
提供商,下面就是一个Proviver,一共有5种构造提供商的方式:TypeProvider, ValueProvider, ClassProvider, ExistingProvider, FactoryProvider
{ provide: Logger, useClass: Logger }
Token :
令牌,提供商中的第一个参数就是Token,在查找依赖时作为 key 使用。
Injector :
注入器,用于解析依赖和创建对象。
Example
class Engine {start() {console.log(engine start);}}class Car {engine: Engine;constructor(@Inject(Engine) engine) {this.engine = engine;}open() {this.engine.start();console.log(car open);}}let inj = ReflectiveInjector.resolveAndCreate([Car,Engine]);let car = inj.get(Car);car.open();
2. 解析服务提供商,构造注入器
在上面注解完成之后,接下来可以构造 Injector,Injector 首先需要解析 Provider.
let inj = ReflectiveInjector.resolveAndCreate([{provide:Car,useClass:Car},{provide:Engine,useClass:Engine}]);
Provider 的解析主要由 resolveReflectiveProviders() 来完成,解析过程主要分为
provider 参数预处理解析实例化工厂及其依赖合并提供商构造注入器
下面是解析过程的源码
export function resolveReflectiveProviders(providers: Provider[]): ResolvedReflectiveProvider[] {