$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. OC基础--Xcode 模板修改和文档安装

    修改项目模板 项目模板就是创建工程的时候选择的某一个条目, Xcode会根据选择的条目生成固定格式的项目 如何修改项目模板 找到Xcode, 右键"显示包内容" 打开"/ ...

  2. web学习之开发环境的搭建

    开发工具 myeclipse2014: tomcat7.0 jdk7.0 1:新建一个web projcat 2:找到web root目录下的index.jsp 这是项目首页 3:访问web项目 ht ...

  3. C# unity3d 贪吃蛇 游戏 源码 及其感想

    这个游戏的设计过程是这样的: 1,创建

  4. could not build module 'XXXXXXXX'或者error: expected identifier or '(' 。一堆奇怪的错误————错误根源

    一堆奇怪的错误:1⃣️could not build module 'XXXXXXXX' 2⃣️error: expected identifier or '(' 3⃣️EDIT Setting Pr ...

  5. JS 4 新特性:混合属性(mixins)之二

    Mixins many classes[混合许多个类] 迄今为止,我们已经学会了简单的继承,我们还能够通过使用mixins处理机制来混合许多类.源于这种理念是非常简单的:我们能够把许多个类最终混合到一 ...

  6. Intent之前的对象传递与fragment传递数据

    Android中Intent传递类对象提供了两种方式一种是 通过实现Serializable接口传递对象,一种是通过实现Parcelable接口传递对象. 要求被传递的对象必须实现上述2种接口中的一种 ...

  7. Python学习路程day20

    本节内容: 项目:开发一个简单的BBS论坛 需求: 整体参考“抽屉新热榜” + “虎嗅网” 实现不同论坛版块 帖子列表展示 帖子评论数.点赞数展示 在线用户展示 允许登录用户发贴.评论.点赞 允许上传 ...

  8. C++Promise函数

    Promise内部会建立一个shared state是用来放一个相应的类型的值或是一个异常,并可被future object 取其数据当线程结果 promise是在形成成果后才将结果放进shared ...

  9. Convert

    Person p=teacher as person; If (p!=null ) dostring (); 使用这样的方法效率高 使用 is时 进行两次判断效率低

  10. 第二章:搭建Android开发环境

    通过对本章节内容的阅读,了解了Android底层开发所需要的各种开发工具,以及在Linux环境下怎样搭建Android底层开发环境,在Linux系统上开发Android应用程序,需要安装Linux版本 ...