什么是依赖注入
- 依赖注入: Dependency Injection 简称 DI
 - 控制反转: Inversion of Control 简称 IOC
 
实现了 “控制反转” 模式的框架被称为 IOC 容器, Angular 是一个 IOC 容器, Angular 实现 “控制反转” 的手段是 “依赖注入”.
依赖注入的优点
- 松耦合, 可重用性.
 - 提高可测性.
 
注入器
Angular “依赖注入” 的注入点只有一个: constructor.
1  | constructor(  | 
手动使用注入器
仅供理解时使用这种方式, 实际开发中不用.
1  | private folderService: FolderService;  | 
注入器的层级关系
应用级注入器(AppModule)
主组件注入器(AppComponent)
子组件注入器(ChildComponent)
提供器
在 module 或 component 里指定 providers 来告诉 Angular 哪些对象需要 “依赖注入”.
1  | ({  | 
提供器的作用域
- “提供器” 可以声明在模块(module)和组件(component)里.
 - 当一个 “提供器” 声明在模块里时, 该 “提供器” 对当前模块下的所有组件可见.
 - 当一个 “提供器” 声明在组件里时, 该 “提供器” 只对当前组件及其当前组件下的所有子组件可见.
 - 使用 “提供器” 时遵循就近原则, 如果名字(token)相同, 会优先使用组件内声明的.
 - 优先考虑声明到模块内.
 
工厂函数 “提供器”
1  | ({  | 
其他
- 在 “注入器” 里注入 
FolderService, Angular 会去 “提供器” 里寻找同名的对象, 如:provide对应的FolderService, 然后new一个useClass对应的FolderService注入到被调用的地方. 
@Injectable 装饰器
@Injectable()装饰器表示当前服务可以注入其他服务, 并不是说当前服务可以注入到其他服务里.- 想在 服务 A 里注入 服务 B, 需要将 服务 B 声明在共同的父模块里.
 @Component()装饰器继承自@Injectable(), 所以在组件里也可以注入其他服务.