@Inject与@Injectable

在Angular框架中,经常会使用到@Inject与@Injectable这两个装饰器。它们与框架的依赖注入系统息息相关。

什么是Angular Injector

Injector,注入器。主要工作是负责向服务与组件、指令等注入依赖。Injector主要通过Angular provider中的token进行查找需要注入的依赖。Angular Provider中提供了依赖的相关信息,比如token,创建实例的方式等。Injector通过这些信息进行创建实例,并负责把实例注入到服务、组件、指令中。

什么时候创建Angular Injector

首先,在根模块启动的时候会创建一个注入器,此时这个注入器作用于全局。整个应用会创建一棵组件树,appcomponent为根组件。同样,injector也会配合创建注入器树,为每个组件维护需要注入的内容。

怎么注册需要注入的依赖

可以使用Providers,具体使用provide:[Aservice,Bservice],复杂一点的如providers:[{provide:xxx,useValue:xxx}],还可以useClass,useFactory,以及depths等。这里不再具体展开。

@Injectable

@Injectable装饰器是告诉Angular框架,这个服务或者组件的构造函数的参数需要依赖注入器进行注入。所以如果构造函数中没有参数,可以无需@Injectable装饰器。组件和指令为什么没有@Injetable也能注入构造函数中的参数?因为@Component和@Directive装饰器也具备告知框架构造函数参数需要依赖注入,所以无需再组件、指令中使用@Injectable装饰器。

@Inject

@Inject是构造函数参数的注入器。@Inject(token) private ualue:ValueType,它告诉Angular框架需要从注入器中获取token对应的一个实例进行注入。所以如果我们在一个服务中的构造函数中依赖注入参数,也可以不使用@Injectable装饰器,可以直接在参数中使用@Inject(Aservice) private aService: Aservice进行注入。

你可能感兴趣的:(Angular,Angular,DI)