文档章节

依赖注入的实现

 不枝雀
发布于 2016/03/12 12:10
字数 718
阅读 6
收藏 0
//首先,建立一个对象的集合
var coms = {};
//在集合中存在一些不依赖其他对象的对象u1,u2,构造方法
coms.u1 = function () {
	console.log("u1");
};
coms.u2 = function () {
	console.log("u2");
};
//也存在一些依赖其他对象的方法(这些对象的依赖关系不可构成环)
coms.n1 = function (u1, u2) {
	console.log("use u1 and u2 to construct n1");
};
coms.n2 = function (u1, n1) {
	console.log("use u1 and n1 to construct n2");
};
//假如现在要新建一个n1对象,就要先新建u1,u2对象,
var make_n1 = function () {
	var u1 = new coms.u1();
	var u2 = new coms.u2();
	var n1 = new coms.n1(u1, u2);
	return n1;
};
//假如要创建n2对象,就要先创建n1
var make_n2 = function () {
	var u1 = new coms.u1();
	var n1 = make_n1();
	var n2 = coms.n2(u1, n1);
	return n2;
};
//从make_n1,make_n2来看,新建一个依赖其他对象的对象不是很方便


//coms中对象都有自已的名字,如果我们把一个构造方法所依赖的对象的名字放在数组中
var coms_needs = {
	n1: ['u1', 'u2'],
	n2: ['u1', 'n1']
};

//就可以这样来创建对象
var make1 = function (name) {
	var constructed_objects = [];
	var needs_array = coms_needs[name];
	needs_array && needs_array.forEach(function (need_name) {
		constructed_objects.push(make1(need_name));
	});
	var con = coms[name];
	con.apply(con, constructed_objects);
};

//在编程中,把coms_needs中的依赖对象和coms中的构造方法一一对应也不方便,
//一般会动态生成coms_needs,或者将名字作为构造方法的一个属性如
coms.n1.needs=['u1','u2'];
coms.n2.needs=['u1','n1'];

var make2 = function (name) {
	var constructed_objects = [];
	var needs_array = coms[name].needs;//这里读取依赖对象的方法也相应地变化
	needs_array && needs_array.forEach(function (need_name) {
		constructed_objects.push(make2(need_name));
	});
	var con = coms[name];
	con.apply(con, constructed_objects);

};

//js中  coms_needs 是没有必要的,因为用 toString 方法可以直接读取函数的参数的变量名,
//用变量名作为依赖对象的名称,如下
var make3 = function (name) {
	var constructed_objects = [];
	//这里读取依赖对象的方法直接使用toString
	var needs_names = coms[name].toString().match(/function\s*\([^)]*\)/)[1];
	var needs_array = needs_names && needs_names.replace(/ /g, '').split(',');
	needs_array && needs_array.forEach(function (need_name) {
		constructed_objects.push(make3(need_name));
	});
	var con = coms[name];
	con.apply(con, constructed_objects);
};

//js发布时,有时会压缩变量名,使make3方法失败,另外make3方法的速度也较慢。
//在angular中默认使用与make2相似的数组方法,没有数组时才使用make3方法。

//使用依赖注入,配合使用懒汉模式及单例模式,基本可以轻松实现资源按需加载,
//对象按需创建,减少资源浪费,加快启动速度。

//当然,依赖注入也可以使用其他方式实现,这里不再细述。

 

© 著作权归作者所有

共有 人打赏支持
粉丝 0
博文 1
码字总数 718
作品 0
苏州
前端工程师
Play! Framework 系列(三):依赖注入

本文由 Shaw 发表在 ScalaCool 团队博客。 在Play! Framework 系列(二)中我们介绍了 Play 的项目结构。在日常处理业务逻辑的时候,我们都会用到依赖注入,本文将介绍一下 Play! 中的依赖注...

ScalaCool
2017/11/15
0
0
Android上使用Dagger实现依赖注入

前面看过不少Dagger介绍的文章,总是感觉读着糊涂,弄复杂了。碰到一篇写得简单明了的文章,翻译出来。原文链接: http://www.vogella.com/tutorials/Dagger/article.html 依赖注入(depende...

开源中国驻成都办事处
2016/05/03
286
0
照虎画猫写自己的Spring——依赖注入

前言 上篇《照虎画猫写自己的Spring》从无到有讲述并实现了下面几点 声明配置文件,用于声明需要加载使用的类 加载配置文件,读取配置文件 解析配置文件,需要将配置文件中声明的标签转换为F...

Jackie_Zheng
2017/11/25
0
0
Java 依赖注入总结

最近在研读Hive社区版本的源码,发现其中多处用到了Java依赖注入,这里简单总结一下依赖注入的几种实现方法。在谈java依赖注入之前,有必要先回顾一下设计模式中的Proxy模式。 其实每个模式名...

半夜菊花茶
2017/11/03
0
0
laravel依赖注入和控制反转

依赖注入与控制反转 依赖注入 当我第一次接触这个词的时候,我是有些丈二和尚摸不着头脑的,至今我也是感到比较困惑的,所以今天我们来探索一下Laravel中的, 来好好的理解它。 控制反转 第一...

eatnothing
2016/05/15
525
0

没有更多内容

加载失败,请刷新页面

加载更多

React 服务器渲染原理解析与实践

网盘下载地址 React 服务器渲染原理解析与实践 本套课程,讲解了React中SSR技术的整个搭建思路及流程,完整的从原理上讲清楚了SSR的概念,重点在于讲解编写SSR框架遇到的各种知识点,以及细节...

qq__2304636824
45分钟前
1
0
Jenkins使用

clean install -Dmaven.test.skip=true

1713716445
54分钟前
0
0
多线程

1. 多线程概念。并发和并行的概念。 多线程指的是一段时间内cpu同时执行多个线程。一个程序至少运行>=1个进程,进程就是运行中的程序,而一个进程至少运行>=1个线程,线程是操作系统能调度的...

鱼想吃肉
今天
2
0
HBase 表修复在线方式和离线方式

一、在线修复 1.1 使用检查命令 $ ./bin/hbase hbck 该命令可完整修复 HBase 元数据信息;存在有错误信息会进行输出; 也可以通过如下命令查看详细信息: $ ./bin/hbase hbck -details 1.2 ...

Ryan-瑞恩
今天
3
0
redis 系列二 -- 常用命令

1.基础命令 info ping quit save dbsize select flushdb flushall 2.键命令 2.1 set 直接赋值 set a a 2.2 get 取值 get a 2.3 exists 是否存在 exists a 2.4 expire 设置剩余时间 秒 expire......

imbiao
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部