$injector:
  (When you request a service, the $injector is responsible for finding the correct service provider, instantiating it and then calling its $get service factory function to get the instance of the service.)   $injector用来提供正确的服务provider,实例化服务,然后调用他的$get方法来获取服务实例
//provide源码
function provider(name, provider_) { if (isFunction(provider_)) { provider_ = providerInjector.instantiate(provider_); }
if (!provider_.$get) { throw Error('Provider ' + name + ' must define $get factory method.');
} return providerCache[name + providerSuffix] = provider_;
}
 //service源码
function service(name, constructor) { return factory(name, ['$injector', function($injector) { return $injector.instantiate(constructor); }]);
}

本例引自 http://www.mamicode.com/info-detail-247448.html


// 创建myModule模块、注册服务
 var myModule = angular.module('myModule', []);
 myModule.service('myService', function() {
     this.my = 0;
});
// 创建herModule模块、注册服务
 var herModule = angular.module('herModule', []);
 herModule.service('herService', function() {
     return{her:1}
});

// 加载了2个模块中的服务,此处必须传入一个数组,即使只加载一个模块,并且angular.injector()可以调用多次,每次都返回新建的injector对象
//$injector用法跟此例相同,只不过是作为服务注入到其他服务中去,然后又调用get,invoke等方法实例化其他服务

 var injector = angular.injector(["myModule","herModule"]);  

 alert(injector.get("myService"));     //injector.get("myService")会返回一个由myservice作为构造函数创建的对象

 alert(injector.get("herService"));    //此处会得到一个由herService返回的{her:1}对象
 // 获取injector
var injector2 = angular.injector(["myModule"]);
//invoke与get的区别是一个传入回调函数或数组,一个传入服务名 // 第一种inference(如果用压缩工具的话,由于js压缩工具JavaScript minifiers/obfuscators会缩短变量名,因此myservice会被缩短);
injector2.invoke( function(myService){ alert(myService); } ); //获取到模块之后调用挂载在模块上的myservice服务,将服务名作为参数传入 // 第二种annotation
function foo(serviceA) {alert(serviceA.my);};
foo.$inject = ['myService'];
injector2.invoke(foo); // 第三种inline
injector.invoke(['myService', function(serviceA){alert(serviceA.my);}]); //inline方法其实就是一二方法的结合而已
 

$provide:
  (The $provide service has a number of methods for registering components with the$injector. Many of these functions are also exposed on angular.Module.)
  $provide 服务有一系列的方法(6个方法: provider,value,constant,factory,service,decorator),这些方法用 $injector来注册组件,大部分的方法都暴露在了angular.module下,也就是可以直接在module下调用这些函数。   注意,所有服务都是延迟实例化的。这意味着所有的服务只有在需要时,或者被依赖时才会实例化。换句话说,AngularJS不会实例化服务,除非被请求了或者被应用直接或间接依赖了。
  
 provider(name, provider);

 factory(name, $getFn);

 service(name, constructor);

 value(name, value);

 constant(name, value);

 decorator(name, decorator);

  provider的第二个参数如果是一个对象(第一种情况),会检索该对象的$get方法,然后调用该方法,最终得到的就是直接调用该方法后的返回值,而不是将该方法作为构造函数返回的新对象。如果第二个参数是函数,则会将该函数作为构造函数创建一个新对象,又再去检索$get方法,和第一种情况相同

  factory的第二个参数最终也会作为$get方法返回一个值,而service第二个参数是传入一个构造器,因此只会返回对象(当然也包括数组,函数等)

  value服务不能作为依赖注入config()方法中, 也就是 .config( function(value){ } )会报错,   但可作为依赖注入其他服务,并且值可以改变,constant可以注入config()中,但值不可被改变

  decorator服务能够修改除constant(否则报错)以外的其他服务,第二个参数必须是一个函数,否则报错,就算修改value服务的值也需要在函数中返回修改后的值;修改service服务是可以返回任何值,不仅限于对象。  使用decorator必须在相应服务定义了之后才能修改,否则会报出找不到相应服务的错误。函数中传入的$delegate代表修改之前服务返回的原始值;

(此外,如controllerProvide.register(name,constructor),$filterProvider等$filterProvider.register(name,factory)可以用来注册一个过滤器,跟在模块上注册服务是一样的;)

run块,config块:
  1. Configuration blocks - get executed during the provider registrations and configuration phase. Only providers and constants can be injected into configuration blocks. This is to prevent accidental instantiation of services before they have been fully configured.
  2. Run blocks - get executed after the injector is created and are used to kickstart the application. Only instances and constants can be injected into run blocks. This is to prevent further system configuration during application run time.
 When bootstrapping, first Angular applies all constant definitions. Then Angular applies configuration blocks in the same order they were r egistered.  

 Run blocks are the closest thing in Angular to the main method. A run block is the code which needs to run to kickstart the application. It is   executed after all of the services have been configured and the injector has been created. Run blocks typically contain code which is hard t     o unit-test, and for this reason should be declared in isolated modules, so that they can be ignored in the unit-tests. 
 当引导程序开始时,angular会先运行所有的constant定义,这是为了可以在config运行之前注入config中,接着是config块会按照注册的顺序被执行,最后才是run块在服务配置好和注入器被创建之后执行。

Angularjs 服务注册的更多相关文章

  1. AngularJS笔记---注册服务

    在前面的笔记中,了解到AngularJS的后台控制可以在Controller里面实现. 可是如果所有的逻辑代码都写到Controller会显得该Controller过于臃肿. 不方便维护, Angul ...

  2. 前端MVC学习总结(三)——AngularJS服务、路由、内置API、jQueryLite

    一.服务 AngularJS功能最基本的组件之一是服务(Service).服务为你的应用提供基于任务的功能.服务可以被视为重复使用的执行一个或多个相关任务的代码块. AngularJS服务是单例对象, ...

  3. 前端MVC学习笔记(三)——AngularJS服务、路由、内置API、jQueryLite

    一.服务 AngularJS功能最基本的组件之一是服务(Service).服务为你的应用提供基于任务的功能.服务可以被视为重复使用的执行一个或多个相关任务的代码块. AngularJS服务是单例对象, ...

  4. 18.angularJS服务

    转自:https://www.cnblogs.com/best/tag/Angular/ 服务 AngularJS功能最基本的组件之一是服务(Service).服务为你的应用提供基于任务的功能.服务可 ...

  5. Consul 服务注册与服务发现

    上一篇:Mac OS.Ubuntu 安装及使用 Consul 1. 服务注册 对 Consul 进行服务注册之前,需要先部署一个服务站点,我们可以使用 ASP.NET Core 创建 Web 应用程序 ...

  6. 分布式服务注册和发现consul 简要介绍

    Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发现的方案,Consul的方案更"一站式",内置了服务注册与发现框 架 ...

  7. Spring-cloud & Netflix 源码解析:Eureka 服务注册发现接口 ****

    http://www.idouba.net/spring-cloud-source-eureka-client-api/?utm_source=tuicool&utm_medium=refer ...

  8. springcloud(第三篇)springcloud eureka 服务注册与发现 *****

    http://blog.csdn.net/liaokailin/article/details/51314001 ******************************************* ...

  9. Dubbo_异常_服务注册运行正常但是Dubbo-Admin看不到服务(亲测可用)

    一.背景: 1.Dubbo服务正常注册到ZooKeeper 2.客户端调用Dubbo服务正常 二.原因: Dubbo-Admin未配置分组信息 三.解决步骤: 1.dubbo.properties添加 ...

随机推荐

  1. tpch-kudu

    1.在impala里建立好文本表: create external table customer (C_CUSTKEY INT, C_NAME STRING, C_ADDRESS STRING, C_ ...

  2. adb shell

    1.获取进程ID adb shell ps |findstr packagename 2.获取cpu的值 adb shell dumpsys cpuinfo |findstr packagename ...

  3. centos 7 下安装numpy、scipy等python包

    本文适用于刚入门的小白,欢迎大牛们批评指正. 因为要开始数据分析,而python又不像R和matlab那么简洁.需要安装的包很多~ 网上找了好多牛人博客,想在centos7下安装numpy,scipy ...

  4. 用profile分析算法性能

    在命令行输入:profile viewer 会出现如下图所示探查器: 在运行此代码的后面的输入框中输入要运行的程序,然后点击启动探查,就会自动探查. 探查结束之后,会给出每个函数的调用次数.运行时间等 ...

  5. 【JavaScript】之【Object】

    见代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  6. C#读取大文本文件

    今天偶遇一同事抱怨,sqlserver导出的CSV,明明有1000W条,但用excel打开就只剩100W了,足足消失了90%,所以她怀疑文件是足量的1000W条,是excel捣了鬼.可是文件容量有2G ...

  7. SE1-soc入手又有的东西可以玩了

    笔者之前只有DE2-35 和DE2-70 两个板子用,相比之下亮点主要是:配备了DDR3 的存储器,视频处理能处理更高帧频和画幅数了,此外直接有了USB2.0接口,还配有A9 Arm双核芯片,功能一下 ...

  8. 总结之H3C汇聚层交换机认证在线人数展示系统

    前情提要:意外接了老师说的一个小程序,然后计划7天(实际10天)的小项目就冒出来了. (1)时间与工程量.在和老师开始谈具体需求前,我凭感觉猜了猜完成这个小项目的时间.然后,再和老师确定需求后,再回头 ...

  9. Html 之div+css布局之css选择器

    CSS选择器 什么叫选择器?通俗的来说就是 我想改变html 中某个地方的  字体大小 或者背景色 或者其它属性 内边距 外边距,宽度高度 等等 一些Css 样式. 那么我们如何找到对应的 元素呢? ...

  10. LayaAir引擎——(五)

    LayaAir引擎——关于地图详解 所需要的软件: LayaAirIDE1.0.2版本 在LayaAir引擎中与地图相关的类: 1.laya.map.TiledMap TiledMap类   地图以层 ...