2019独角兽企业重金招聘Python工程师标准>>>

在java的世界中我们有spring的DI神器,而在angular的世界中我们同样有DI,由于这里文章篇幅偏大,只捡主要的讲解,其他的信息可参考最后给出的链接

什么是装饰器,装饰器都有什么

  • 装饰器 java里面叫注解,angular官方称其为装饰器.其最后会生成json文件的元数据文件.

  • 装饰器类型

装饰器 作用 重要
Component 标记类作为组件并收集组件配置元数据(继承Directive) *****
Directive 标记类作为指令并收集组件配置元数据 *****
Injectable 标记元数据并可以使用Injector注入器注入 *****
Inject 指定依赖关系的参数装饰器(一般用来注入被标记Injectable的类) **
Optional 将依赖项标记为可选的参数元数据. 如果没有找到依赖关系,注射器将提供null **
ContentChild 配置一个内容查询 ***
ViewChild 配置一个视图查询 ***
ViewChildren 配置多个视图查询(返回QueryList类型) ***
ContentChildren 配置多个个内容查询(返回QueryList类型) ***
Host 按照依赖关系来检索 **
Self 指定注射器只能从本身检索依赖关系 **
SkipSelf 指定注射器只能从父类检索依赖关系 **
Type 调用ES7装饰 *

java的世界大家都叫他注解,其实就是带着@符号的类(暂时这么理解就好)

依赖注入的好处

有了依赖注入我们可以随时更改注入类,比如我们定义一个日志接口Logger,其实现类有Logger1,Logger2,Logger3....,等一系列实现,假如我们要没有依赖注入,那么我们要创建n多次实例,有了依赖注入,只需要更改下就可以了.

useClass属性

useClasss,要注入的实际子类

providers:[{ provide: Logger, useClass: Logger1 }]

注意千万别使用接口注入,例如useClass放一个接口,那么angular会报错的,因为在JavaScript世界里面没有接口的概念

useExisting属性

useExisting,使用已经注册的类型注入到这里(即别名),下面示例意思是将Logger1起个叫Logger2的别名

providers:[{ provide: Logger2, useExisting: Logger1 }]

useValue属性

useValue,值或对象替换,如

{ provide: MyValue, useValue: 41 }

useFactory属性

useFactory,使用工厂注入

//采用的lambda表达式语法
let testServiceFactory = (logger: Logger) => {return new TestService(logger);
};providers:[{ provide: TestService , useFactory: testServiceFactory, deps: [Logger] }]

deps属性

deps属性是提供商令牌(其实就是一个类的标示)数组.

手动创建一个基于接口的注入类

解决方案是定义和使用 OpaqueToken(不透明的令牌)。定义方式类似于这样:

import { OpaqueToken } from '@angular/core';
export let APP_CONFIG = new OpaqueToken('app.config');

使用这个OpaqueToken对象注册依赖的提供商:

providers: [{ provide: APP_CONFIG, useValue: HERO_DI_CONFIG }]

现在,在@Inject装饰器的帮助下,这个配置对象可以注入到任何需要它的构造函数中:

constructor(@Inject(APP_CONFIG) config: AppConfig) {this.title = config.title;
}
  • 虽然ConfigAppConfig接口在依赖注入过程中没有任何作用,但它为该类中的配置对象提供了强类型信息。

或者在 ngModule 中提供并注入这个配置对象,如AppModule。

providers: [UserService,{ provide: APP_CONFIG, useValue: HERO_DI_CONFIG }
]

总结

关于Inject和Optional的说明,这里没有说明,具体的可以的可以参照上面表格去查看官方教程.

其他资料

中文官方文档

英文官方文档

查看源代码

演示地址

如要转载,请保持本文完整,并注明作者luamas和本文原始地址:https://blog.luamas.com/2017/03/25/angular2-006-dependency-injection/

转载于:https://my.oschina.net/stategrace/blog/867240

Angular2学习笔记(六) Angular2 依赖注入相关推荐

  1. 《Pro ASP.NET MVC 3 Framework》学习笔记之五【依赖注入及ninject工具使用】

    一,创建松耦合的组件 1."分解关注点"是MVC模式里面一个非常重要的特性.我们想要在应用程序里面创建的组件尽可能的独立,这样我们就能管理比较少的依赖关系.理想情况下,每个组件都是 ...

  2. angular学习(六)—— 依赖注入

    转载请写明来源地址:http://blog.csdn.net/lastsweetop/article/details/53409171 依赖注入 依赖注入(DI)是一种处理组件如何获得依赖的软件设计模 ...

  3. Angular学习笔记四之依赖注入与服务

    一.依赖注入 (一)依赖注入理解 先来看一段代码: class Engine {// Engine类的构造函数,需要接受一个number类型的参数constructor(speed: number) ...

  4. Spring.NET学习笔记10——方法的注入(基础篇) Level 200

    多数用户都会将容器中的大部分对象布署为singleton模式.当一个singleton对象需要和另一个singleton对象协作,或者一个非singleton对象需要和另一个非singleson对象协 ...

  5. Ethernet/IP 学习笔记六

    Ethernet/IP 学习笔记六 EtherNet/IP defines two primary types of communications: explicit and implicit (Ta ...

  6. 吴恩达《机器学习》学习笔记六——过拟合与正则化

    吴恩达<机器学习>学习笔记六--过拟合与正则化 一. 过拟合问题 1.线性回归过拟合问题 2.逻辑回归过拟合问题 3.过拟合的解决 二. 正则化后的代价函数 1.正则化思想 2.实际使用的 ...

  7. ROS学习笔记六:理解ROS服务和参数

    ROS学习笔记六:理解ROS服务和参数 主要介绍ROS服务和参数,同时使用命令行工具rosservice和rosparam. ROS service service是节点之间互相通信的另一种方式,se ...

  8. opencv 手选roi区域_【opencv学习笔记六】图像的ROI区域选择与复制

    图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...

  9. JS学习笔记六:js中的DOM操作

    1. JS学习笔记六:js中的DOM操作 文章目录 1. JS学习笔记六:js中的DOM操作 1.1. 获取Dom节点 1.2. 元素属性的操作方式 1.3. DOM节点的创建.插入和删除 1.4. ...

最新文章

  1. R使用neuralnet包构建神经网络回归模型并与线性回归模型对比实战
  2. 25 张图读懂「文件系统」
  3. Android stadio 关联源码
  4. Android事件流程详解
  5. pytorch问题汇总
  6. mysql 存储过程与存储函数
  7. Git初学使用命令记录
  8. java 6 损坏,Java 异常处理六
  9. Xcode增加头文件搜索路径的方法
  10. 3、Keras中的顺序模型Sequential和函数式模型Model
  11. BP神经网络模型介绍
  12. Java 验证身份证号码
  13. 安装VS2010旗舰版时出现.Net framework4.0,安装失败
  14. 2021-08-11好奇心
  15. 数据分析真题日刷 | 网易2018校园招聘数据分析工程师笔试卷
  16. python in arcgis_终于晓得arcgis-python入门教程
  17. 如何使用 PowerShell 锁定、解锁、启用和禁用 AD 帐户
  18. 搭建Gitea和Drone环境
  19. Python学习笔记05----条件、循环及其他语句
  20. 如何下载因特尔显卡的最新驱动

热门文章

  1. 一款好看的html动态跳转页源码
  2. 百度SEO站群Emlog最新付费模板带会员 做资源网不错
  3. 防御 | 阻止木马侵入(电脑设置)
  4. PHP内核通用网站后台权限管理系统源码
  5. java阿里云短信服务开通验证码功能实现(1)
  6. Node.js 连接 MySQL 并进行数据库操作
  7. 数据库连接池问题[转]
  8. Bootstrap3 价格滑动块 price range bootstrap-slider
  9. cakephp 1.3 Controller
  10. 斗地主AI算法——第十五章の测试模块