一个对象可以通过三种方式来获取对依赖对象的控制权:

  1.在内部创建依赖的对象

  2.通过全局变量引用这个依赖对象

  3.通过参数进行传递(在这里是通过函数参数)

AngularJs通过$injector注入器服务来管理依赖关系的查询和实例化,通过其get方法来获取依赖服务的实例,简单点说,它就是生产依赖对象的工厂,负责实例化AngularJs中所有的组件,包括应用的模块、指令、控制器。

可以通过三种方式进行依赖注入:

推断式依赖注入

AngularJs会推断参数的名称就是依赖的对象。

声明式依赖注入

利用$inject属性进行显式声明,为一个数组,其元素为所依赖实例对象的名称,并且顺序要与被注入目标的参数顺序保持一致。

行内依赖注入

在定义一个AngularJs对象的时候,直接传入一个参数数组,前面几个元素是可以被注入到对象的依赖的名称,最后一个元素是目标对象本身。

总结一下,任何模块启动的时候,都会应该会获取一个注入器的实例,注入器维护一个注册列表,通过其has()方法来确定一个依赖对象是否存在,通过get()方法进行获取。

在我们定义控制器,指令,模块的时候,应该会这些对象添加到注入器维护的注册表(类似字典一样的对象)中。

$injector API

  1.   annotate() 帮助$injector判断哪些服务在函数调用的时候会被注入进去,返回的是一个由服务名称组成的对象。
  2.   get() 获取依赖对象的实例
  3.   has() 注入器维护的注册表中是否存在所需的依赖的对象。
  4.   instantiate(type,locals) 创建某个JavaScript类型的实例,通过new操作符号来调用其构造函数,并将所有的参数都传递给构造函数,返回Type的一个新实例。
  5.   invoke(fn,self,locals) fn要调用的函数,self用来指定调用方法的this参数,locals传递额外的参数进入。

代码测试一下:

<!doctype html>
<html ng-app="myApp">
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0-rc.3/angular.js"></script>
</head>
<body>
<div ng-app="myApp"></div>
</div>
<script>
angular.module('myApp', [])
var object={ last_name:'zhao',first_name:'xiaoming'}
var injector =angular.injector(['ng','myApp']);
injector.invoke(function ($log) {
$log.info("this[name]:"+ this.name)
$log.info("locals[last_name]:"+object.last_name)
$log.info("locals[first_name]:"+ object.first_name)
},{ name:'baishoujing'},object)
</script>
</body>
</html>

  注意:获取注入器的时候,获取指定App的注入器,不然的话会找不到对应所需的依赖对象。

运行结果如下:

AngularJs 学习笔记(三)依赖注入的更多相关文章

  1. AngularJS学习笔记之依赖注入

    最近在看AngularJS权威指南,由于各种各样的原因(主要是因为我没有money,好讨厌的有木有......),于是我选择了网上下载电子版的(因为它不要钱,哈哈...),字体也蛮清晰的,总体效果还不 ...

  2. SpringMVC:学习笔记(11)——依赖注入与@Autowired

    SpringMVC:学习笔记(11)——依赖注入与@Autowired 使用@Autowired 从Spring2.5开始,它引入了一种全新的依赖注入方式,即通过@Autowired注解.这个注解允许 ...

  3. Spring.NET学习笔记6——依赖注入(应用篇)

    1. 谈到高级语言编程,我们就会联想到设计模式:谈到设计模式,我们就会说道怎么样解耦合.而Spring.NET的IoC容器其中的一种用途就是解耦合,其最经典的应用就是:依赖注入(Dependeny I ...

  4. Angular4.0从入门到实战打造在线竞拍网站学习笔记之三--依赖注入

    Angular4.0基础知识之组件 Angular4.0基础知识之路由 依赖注入(Dependency Injection) 正常情况下,我们写的代码应该是这样子的: let product = ne ...

  5. Spring学习笔记1—依赖注入(构造器注入、set注入和注解注入)

    什么是依赖注入 在以前的java开发中,某个类中需要依赖其它类的方法时,通常是new一个依赖类再调用类实例的方法,这种方法耦合度太高并且不容易测试,spring提出了依赖注入的思想,即依赖类不由程序员 ...

  6. Unity学习笔记(4):依赖注入

    Unity具体实现依赖注入包含构造函数注入.属性注入.方法注入,所谓注入相当赋值,下面一个一个来介绍 1:构造函数注入 1.1当类有多个构造函数时,可以通过InjectionConstructor特性 ...

  7. angular2 学习笔记 ( DI 依赖注入 )

    refer : http://blog.thoughtram.io/angular/2016/09/15/angular-2-final-is-out.html ( search Dependency ...

  8. Asp.net core 学习笔记 ( DI 依赖注入 )

    比起 Angular 的依赖注入, core 的相对简单许多, 容易明白 所有 provider 都在 startup 里配置. public void ConfigureServices(IServ ...

  9. [学习笔记]Spring依赖注入

    依赖: 典型的企业应用程序不可能由单个对象(在spring中,也可称之bean)组成,再简单的应用也是由几个对象相互配合工作的,这一章主要介绍bean的定义以及bean之间的相互协作. 依赖注入: s ...

  10. Spring学习笔记——Spring依赖注入原理分析

    我们知道Spring的依赖注入有四种方式,各自是get/set方法注入.构造器注入.静态工厂方法注入.实例工厂方法注入 以下我们先分析下这几种注入方式 1.get/set方法注入 public cla ...

随机推荐

  1. [mysql]一次主从数据不一致的问题解决过程

    之前一篇: 主从更换ip之后重新建立同步 情况时这样的 昨天晚上主动2个机器都迁移了,然后今天才把主动重新连接上,但是从库的偏移量是从今天当前时刻开始的,也就是说虽然现在主动看似正常,其实是少了昨天的 ...

  2. Hessian源码分析--HessianSkeleton

    HessianSkeleton是Hessian的服务端的核心,简单总结来说:HessianSkeleton根据客户端请求的链接,获取到需要执行的接口及实现类,对客户端发送过来的二进制数据进行反序列化, ...

  3. iOS开发之一:入门介绍

    今天就介绍一下iOS开发的基本的东西,有很多东西都是经常用到的而我却经常记不住,所以还是写下来吧. iOS开发需要的开发工具是Xcode,而Xcode又必须运行在 OS X(苹果系统)环境下,所以我们 ...

  4. JavaScript中的三种弹出对话框

    学习过js的小伙伴会发现,我们在一些实例中用到了alert()方法.prompt()方法.prompt()方法,他们都是在屏幕上弹出一个对话框,并且在上面显示括号内的内容,使用这种方法使得页面的交互性 ...

  5. java linux ImageIO 验证码在一段时间以后出不来 问题总结

    最近在测试上布署的项目经常性的出现验证码过了一段时间以后出不来的情况,耐心找了一下,最后在上级的指导下发现了报错,其实说真的,我自己也找到了这个报错,只是没有当一回事.因为这个验证码的东西不是我写的, ...

  6. 《java入门第一季》之集合toString源码解析

    代码: Collection c = new ArrayList(); c.add("hello"); c.add("world"); c.add(" ...

  7. Cocos2D:塔防游戏制作之旅(五)

    打开HelloWorldLayer.h文件,添加以下实例变量(在@interface行的花括号之后): NSMutableArray *towerBases; 将HelloWorldLayer.m文件 ...

  8. Java和计算机科学课程的关系

    翻译人员: 铁锚 翻译时间: 2013年11月20日 原文链接: Java and Computer Science Courses 一个好程序员不仅要知道如何编程来完成特定任务,还要了解为什么要这样 ...

  9. 一个优化极点的ViewHolder

    代码中有注释: 使用方法: 1.可以在listview,gridview,stageView直接继承LazyAdapter使用 2.下面有Demo 代码 ViewHolder代码: import an ...

  10. 《java入门第一季》之面向对象(成员方法)

    /* 类的组成:成员变量,成员方法 又加入了一个新的成员:构造方法. 以后再提(类的组成): 成员变量 构造方法 成员方法 根据返回值: void类型 非void类型 形式参数: 空参方法 非空参方法 ...