在上一篇《Angularjs开发一些经验总结》中提到angular开发中的IOC inject优先,所以在这节将引用angularjs的注入代码来分析angularjs的注入方式。在《再谈angularjs DI(Dependency Injection)》中提到angularjs的注入方式分为3中方式,如果你还不清楚的请移步。

  1. 推断式注入:在angularjs中我们可以在我们需要注入的地方按照名称注入,这里要求参数名称必须和注入服务实例名称相同,一种名称约定,angularjs会提取参数名称查找相应DI实例注入;
  2. :标记注入:在angularjs中我们可以利用$inject标注DI注入,这里需要注入服务名称的顺序和构造参数名对应.这里可以解决以上约定的死板性;
  3. 内联注入:对于directives,factory,filter等特殊指令使用$inject标注注入使用不是那么友好,angularjs特别增加了内联注入。

在这里我们先上今天的主角code:

 1 /**
 2 * @ngdoc overview
 3 * @name AUTO
 4 * @description
 5 *
 6 * Implicit module which gets automatically added to each {@link AUTO.$injector $injector}.
 7 */
 8
 9 var FN_ARGS = /^function\s*[^\(]*\(\s*([^\)]*)\)/m;
10 var FN_ARG_SPLIT = /,/;
11 var FN_ARG = /^\s*(_?)(.+?)\1\s*$/;
12 var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
13 function annotate(fn) {
14   var $inject,
15       fnText,
16       argDecl,
17       last;
18
19   if (typeof fn == 'function') {
20     if (!($inject = fn.$inject)) {
21       $inject = [];
22       fnText = fn.toString().replace(STRIP_COMMENTS, '');
23       argDecl = fnText.match(FN_ARGS);
24       forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg){
25         arg.replace(FN_ARG, function(all, underscore, name){
26           $inject.push(name);
27         });
28       });
29       fn.$inject = $inject;
30     }
31   } else if (isArray(fn)) {
32     last = fn.length - 1;
33     assertArgFn(fn[last], 'fn')
34     $inject = fn.slice(0, last);
35   } else {
36     assertArgFn(fn, 'fn', true);
37   }
38   return $inject;
39 }

在上面code中我们可够很清晰的看到首先这里会判断是不是一个'function',如果是的我们这会判断fn.$inject为空,不为空则返回此注入(标记注入),为空则会根据正则匹配获取参数列表,注入服务的名字按名注入;相反如果不是'function'而是Array的话获取前n-1的服务名称注入,这是内联注入。

关于angularjs注入就到这里,在最后想说下说这代码中我们能获取的两个javascript技巧:

  1. 对于javascript是运行时解释的弱类型语言,我们无法利用c#,java类似的反射机制去获取参数信息,我们只能靠正则从javascript代码中匹配(从function.toString()).
  2. 正则的强大之处,在javascript中replace函数的强大应用:
    arg.replace(FN_ARG, function(all, underscore, name){
    $inject.push(name);
    }); 

关于这点可以参考《JavaScript 函数replace揭秘》。

本文转自破狼博客园博客,原文链接:http://www.cnblogs.com/whitewolf/archive/2013/03/27/2983806.html,如需转载请自行联系原作者

Angularjs的IOC Inject分析相关推荐

  1. spring ioc原理分析

    spring ioc原理分析 spring ioc 的概念 简单工厂方法 spirng ioc实现原理 spring ioc的概念 ioc: 控制反转 将对象的创建由spring管理.比如,我们以前用 ...

  2. jQuery和AngularJS的区别小分析

    最近一直在研究angularjs,最大的感受就是它和之前的jQuery以及基于jQuery的各种库设计理念完全不同,如果不能认识到这点而对于之前做jQuery开发的程序员,去直接学习angularjs ...

  3. Spring IOC容器分析(1) -- BeanFactory

    搭建好源码阅读环境后,就可以慢慢走进Spring殿堂了.IOC是Inversion of Control的缩写,控制反转的意思.很多人可能都知道IOC是spring的核心,将对象的创建初始化等权限交由 ...

  4. 手撸spring源码分析IOC实现原理

    手撸spring源码分析IOC实现原理 文章出处:https://github.com/fuzhengwei/small-spring 根据小付哥的手撸spring核心源码一步步学习出来的结果收货总结 ...

  5. ccleaner后门完全分析报告

    2017年9月18日,piriform[1]和思科Talos团队[2]发布公告称piriform旗下产品CCleaner v5.33.6162和CCleaner Cloud v1.07.3191的32 ...

  6. 5.1(Spring)Spring和IOC学习

    文章目录 Spring概述 特点 环境搭建 Maven构建项目 示例不用IOC SpringIOC IOC示例 IOC容器分析 业务层调用数据访问层 方式一 方式二 为什么要用IOC呢 什么是IOC ...

  7. 大白话聊框架设计(入门篇) | 第四章:简单实现IOC容器

    文章目录 **1.简单实现IOC容器** **2.简单介绍IOC容器** **3.创建Inject注解** **4.创建IocContrainer** **5.初始化IOC容器** **6.改造原有N ...

  8. 从IOC的一些实际情况谈对其的评价标准

    IOC作为威胁情报最基础也是最直接体现效果的类型,我们有必要理清一下其核心特性和现实状况,同时也谈一下对其的评价标准. IOC与IDS检测的核心区别在于所覆盖的攻击阶段不同,IOC覆盖洛马模型的后三个 ...

  9. SpringBoot的幕后推手...

    一.背景 ​ 这两年随着微服务的盛行,SpringBoot框架水到渠成的得到了高曝光,作为程序猿的我们,现在要是不知道一点SpringBoot相关的东西,貌似出去找工作都会被深深地鄙视,不过在我们开始 ...

  10. SpringBoot的幕后推手,Java后端知识体系

    阶段二.分析和组装 第一个阶段完成以后,我们可以先暂时认为IoC容器中保存着一个个相互独立的bean,它们之间还没有任何关系,但是实际项目中它们之间是有着不可或缺的关系的,所以呢,Ioc容器第二个阶段 ...

最新文章

  1. C# 8中的默认接口方法
  2. JVM字节码之整型入栈指令(iconst、bipush、sipush、ldc)
  3. 汇编语言int 13中断02h功能Demo - 使用emu8086
  4. Spring AOP源码解析(三)—— AOP引入(续)
  5. 电话聊天狂人 (25 分)【简便解法】
  6. jdbc连接mysql问题
  7. iOS学习笔记03-UITableView
  8. javascript Arrow functions(箭头函数)
  9. mysql模糊查询 or_mysql 模糊查询 - yizhichao的个人页面 - OSCHINA - 中文开源技术交流社区...
  10. mysql neatbean_使用MySQL的NetBeans中的SQL语法错误
  11. 2020年最好用的手机是哪一款_2020年换手机不用盲目,目前这4部最值得买,好看好用性价比高...
  12. java包含某个字符串_JavaScript判断一个字符串是否包含指定子字符串的方法
  13. 拓端tecdat|R如何与Tableau集成分步指南 - 适用于数据科学和商业智能专业人员
  14. php两个手机号正则表达式_php中手机号码正则表达式代码
  15. [异步图书].精通Python自然语言处理 pdf
  16. __init__在python中的用法_如何打“我爱你”的摩斯密码
  17. 行远自迩,不负韶华!2020年度博客之星TOP 20榜单揭晓
  18. [C++题目]:求和s=a+aa+aaa+…+aaa…a(n个a)
  19. 使用Java串口操作RXTX,报错 no rxtxSerial in java.library.path thrown while loading gnu.io.RXTXCommDriver解决方案
  20. MySQL多表查询优化

热门文章

  1. Entity FrameWork利用Database.SqlQueryT执行存储过程并返回参数
  2. 客户的价值源于客户的流程
  3. 单应性变换(Homography)
  4. Ueberschall Elastik 3 for Mac - 弹性Loops音源采样器
  5. TOONTRACK Electronic Edge EZX(Toontrack打击乐扩展包)
  6. Mac上如何在“系统信息”中查看是否兼容新产品?
  7. EasyRecovery软件帮你快速恢复图片数据
  8. Python从菜鸟到高手(1):数字的奥秘
  9. 2016年第四季度思科称霸印度网络市场
  10. mysql 拼音首字母排序