Angularjs的IOC Inject分析
在上一篇《Angularjs开发一些经验总结》中提到angular开发中的IOC inject优先,所以在这节将引用angularjs的注入代码来分析angularjs的注入方式。在《再谈angularjs DI(Dependency Injection)》中提到angularjs的注入方式分为3中方式,如果你还不清楚的请移步。
- 推断式注入:在angularjs中我们可以在我们需要注入的地方按照名称注入,这里要求参数名称必须和注入服务实例名称相同,一种名称约定,angularjs会提取参数名称查找相应DI实例注入;
- :标记注入:在angularjs中我们可以利用
$inject标注DI注入,这里需要注入服务名称的顺序和构造参数名对应.这里可以解决以上约定的死板性;
- 内联注入:对于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技巧:
- 对于javascript是运行时解释的弱类型语言,我们无法利用c#,java类似的反射机制去获取参数信息,我们只能靠正则从javascript代码中匹配(从function.toString()).
- 正则的强大之处,在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分析相关推荐
- spring ioc原理分析
spring ioc原理分析 spring ioc 的概念 简单工厂方法 spirng ioc实现原理 spring ioc的概念 ioc: 控制反转 将对象的创建由spring管理.比如,我们以前用 ...
- jQuery和AngularJS的区别小分析
最近一直在研究angularjs,最大的感受就是它和之前的jQuery以及基于jQuery的各种库设计理念完全不同,如果不能认识到这点而对于之前做jQuery开发的程序员,去直接学习angularjs ...
- Spring IOC容器分析(1) -- BeanFactory
搭建好源码阅读环境后,就可以慢慢走进Spring殿堂了.IOC是Inversion of Control的缩写,控制反转的意思.很多人可能都知道IOC是spring的核心,将对象的创建初始化等权限交由 ...
- 手撸spring源码分析IOC实现原理
手撸spring源码分析IOC实现原理 文章出处:https://github.com/fuzhengwei/small-spring 根据小付哥的手撸spring核心源码一步步学习出来的结果收货总结 ...
- ccleaner后门完全分析报告
2017年9月18日,piriform[1]和思科Talos团队[2]发布公告称piriform旗下产品CCleaner v5.33.6162和CCleaner Cloud v1.07.3191的32 ...
- 5.1(Spring)Spring和IOC学习
文章目录 Spring概述 特点 环境搭建 Maven构建项目 示例不用IOC SpringIOC IOC示例 IOC容器分析 业务层调用数据访问层 方式一 方式二 为什么要用IOC呢 什么是IOC ...
- 大白话聊框架设计(入门篇) | 第四章:简单实现IOC容器
文章目录 **1.简单实现IOC容器** **2.简单介绍IOC容器** **3.创建Inject注解** **4.创建IocContrainer** **5.初始化IOC容器** **6.改造原有N ...
- 从IOC的一些实际情况谈对其的评价标准
IOC作为威胁情报最基础也是最直接体现效果的类型,我们有必要理清一下其核心特性和现实状况,同时也谈一下对其的评价标准. IOC与IDS检测的核心区别在于所覆盖的攻击阶段不同,IOC覆盖洛马模型的后三个 ...
- SpringBoot的幕后推手...
一.背景 这两年随着微服务的盛行,SpringBoot框架水到渠成的得到了高曝光,作为程序猿的我们,现在要是不知道一点SpringBoot相关的东西,貌似出去找工作都会被深深地鄙视,不过在我们开始 ...
- SpringBoot的幕后推手,Java后端知识体系
阶段二.分析和组装 第一个阶段完成以后,我们可以先暂时认为IoC容器中保存着一个个相互独立的bean,它们之间还没有任何关系,但是实际项目中它们之间是有着不可或缺的关系的,所以呢,Ioc容器第二个阶段 ...
最新文章
- C# 8中的默认接口方法
- JVM字节码之整型入栈指令(iconst、bipush、sipush、ldc)
- 汇编语言int 13中断02h功能Demo - 使用emu8086
- Spring AOP源码解析(三)—— AOP引入(续)
- 电话聊天狂人 (25 分)【简便解法】
- jdbc连接mysql问题
- iOS学习笔记03-UITableView
- javascript Arrow functions(箭头函数)
- mysql模糊查询 or_mysql 模糊查询 - yizhichao的个人页面 - OSCHINA - 中文开源技术交流社区...
- mysql neatbean_使用MySQL的NetBeans中的SQL语法错误
- 2020年最好用的手机是哪一款_2020年换手机不用盲目,目前这4部最值得买,好看好用性价比高...
- java包含某个字符串_JavaScript判断一个字符串是否包含指定子字符串的方法
- 拓端tecdat|R如何与Tableau集成分步指南 - 适用于数据科学和商业智能专业人员
- php两个手机号正则表达式_php中手机号码正则表达式代码
- [异步图书].精通Python自然语言处理 pdf
- __init__在python中的用法_如何打“我爱你”的摩斯密码
- 行远自迩,不负韶华!2020年度博客之星TOP 20榜单揭晓
- [C++题目]:求和s=a+aa+aaa+…+aaa…a(n个a)
- 使用Java串口操作RXTX,报错 no rxtxSerial in java.library.path thrown while loading gnu.io.RXTXCommDriver解决方案
- MySQL多表查询优化
热门文章
- Entity FrameWork利用Database.SqlQueryT执行存储过程并返回参数
- 客户的价值源于客户的流程
- 单应性变换(Homography)
- Ueberschall Elastik 3 for Mac - 弹性Loops音源采样器
- TOONTRACK Electronic Edge EZX(Toontrack打击乐扩展包)
- Mac上如何在“系统信息”中查看是否兼容新产品?
- EasyRecovery软件帮你快速恢复图片数据
- Python从菜鸟到高手(1):数字的奥秘
- 2016年第四季度思科称霸印度网络市场
- mysql 拼音首字母排序