文档章节

依赖注入的实现

 不枝雀
发布于 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
控制反转 依赖注入 依赖倒置 Ioc容器

版权声明:有些文章写的很随意,那是仅作为个人记录的文章,建议直接关掉,多看一秒亏一秒 https://blog.csdn.net/qq_36523667/article/details/83043207 上家公司模块间的解耦是通过解析XML...

徐风来
10/15
0
0
照虎画猫写自己的Spring——依赖注入

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

Jackie_Zheng
2017/11/25
0
0
Spring的依赖注入

控制反转(Inversion of Control)和依赖注入(Dependency Injection): IoC,直观地讲,就是容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在...

晨曦之光
2012/04/25
384
0

没有更多内容

加载失败,请刷新页面

加载更多

linux使用docker-compose部署软件配置

本篇将分享一些 docker-compose 的配置,可参考其总结自己的一套基于docker的开发/生产环境配置。下面话不多说了,来一起看看详细的介绍吧 安装docker及docker-compose install docker curl ...

开元中国2015
10分钟前
0
0
GraphQL 基金会成立了:将托管于Linux 基金会管理

GraphQL 基金会在11月7日宣布成立,并将由 Linux 基金会管理。GraphQL 基金会将专用于完善和稳定 GraphQL 生态系统,让 GraphQL 得到广泛关注和采用。GraphQL 是 Facebook 开发的一个应用层数...

Linux就该这么学
21分钟前
5
0
Java开发中内存模型详细解析

Java内存模型虽说是一个老生常谈的问题 ,也是大厂面试中绕不过的,甚至初级面试也会问到。但是真正要理解起来,还是相当困难,主要这个东西看不见,摸不着。网上已经有大量的博客,但是人家...

金铭鼎IT教育
24分钟前
3
0
render常用模版 结合iview

表格添加一对按钮 { title: '操作', align: 'center', render: (h, params) => { return h('div', [ h('Button', { props: { ......

Carbenson
40分钟前
1
0
一次生产 CPU 100% 排查优化实践

前言 到了年底果然都不太平,最近又收到了运维报警:表示有些服务器负载非常高,让我们定位问题。 还真是想什么来什么,前些天还故意把某些服务器的负载提高(没错,老板让我写个 BUG!),不...

crossoverJie
48分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部