依赖注入的实现
依赖注入的实现
不枝雀 发表于2年前
依赖注入的实现
  • 发表于 2年前
  • 阅读 6
  • 收藏 0
  • 点赞 1
  • 评论 0

标题:腾讯云 新注册用户域名抢购1元起>>>   

摘要: 在java web领域的spring以及web 前端框架 angular中都有依赖注入的说法。到底怎么才算依赖注入呢?首先有一些需求池,一个供给池,然后要有运行环境和装配器。在运行环境中,按照当前环境的需求池装配供给池中所能构建的程序体。这些程序体可以是具体的对象,也可以是抽象的方法。
//首先,建立一个对象的集合
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
×
不枝雀
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: