文档章节

依赖注入的实现

 不枝雀
发布于 2016/03/12 12:10
字数 718
阅读 6
收藏 0
点赞 1
评论 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

Android上使用Dagger实现依赖注入

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

开源中国驻成都办事处 ⋅ 2016/05/03 ⋅ 0

照虎画猫写自己的Spring——依赖注入

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

Jackie_Zheng ⋅ 2017/11/25 ⋅ 0

Java 依赖注入总结

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

半夜菊花茶 ⋅ 2017/11/03 ⋅ 0

laravel依赖注入和控制反转

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

eatnothing ⋅ 2016/05/15 ⋅ 0

基于unity框架构造IOC容器

一.写在前面 基于上一篇通过配置文件形成ioc容器的例子,我们采用另外一种方式去形成ioc容器,那就是unity框架。 二.unity简介 Unity 应用程序块(Unity)是一个轻量级、可扩展的依赖注入容器...

我只是一只小小鸟 ⋅ 2016/07/14 ⋅ 0

Spring的依赖注入

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

晨曦之光 ⋅ 2012/04/25 ⋅ 0

什么是依赖注入

Spring 能有效地组织J2EE应用各层的对象。不管是控制层的Action对象,还是业务层的Service对象,还是持久层的DAO对象,都可在Spring的 管理下有机地协调、运行。Spring将各层的对象以松耦合的...

感觉太煽情 ⋅ 2015/03/11 ⋅ 0

架构中的设计原则之依赖注入原则(DIP) - 《java开发技术-在架构中体验设计模式和算法之美》

依赖注入原则的核心思想是:要依赖于抽象,不要依赖于具体的实现。英文缩写是DIP,即Dependence Inversion Principle(可翻译为依赖反转原则)。 其实依赖注入原则的意思就是:在应用程序中,...

Beaver_ ⋅ 2015/04/22 ⋅ 0

对IoC DI的理解

在学习Spring 看视频但是效果不好 关于IoC的理解不是很深刻 在网上找了一篇 写的还比较浅显易懂 转过来 以备以后一些概念又忘了 再来翻阅、温习 from:http://javabrain.iteye.com/blog/106...

zgyin688 ⋅ 2012/10/14 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Qt中的坑--QTreeWidget添加item 不能显示出来

QTreeWidget* pTree = ui.TreeCheckList; QTreeWidgetItem* item = new QTreeWidgetItem(pTree) ;item->setText ( 0, "test" );pTree->addTopLevelItem (item ); 原因是因为创建一个......

k91191 ⋅ 28分钟前 ⋅ 0

使用Guava的RateLimiter做限流

场景: 1. 在日常生活中,我们肯定收到过不少不少这样的短信,“京东最新优惠卷…”,“天猫送您…”。这种类型的短信是属于推广性质的短信。这种短信一般群发量会到千万级别。然而,要完成这...

wind2012 ⋅ 28分钟前 ⋅ 0

QSlider重新enterEvent

#ifndef DIALOG_H#define DIALOG_H#include <QDialog>namespace Ui {class Dialog;}class Dialog : public QDialog{ Q_OBJECTpublic: explicit Dialog(QW......

xxdd ⋅ 29分钟前 ⋅ 0

生产环境redis备份与恢复

生产环境redis备份与恢复 Tyrant0532 0人评论 1563人阅读 2018-02-01 20:34:10 redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。生产中我们主...

rootliu ⋅ 31分钟前 ⋅ 0

nginx中出现403forbidden错误

nginx “403 Forbidden” 错误 出现这个错误一般是因为以下原因: 网站禁止特定的用户访问所有内容,例:网站屏蔽某个ip访问。 访问禁止目录浏览的目录,例:设置autoindex off后访问目录。 ...

河图再现 ⋅ 31分钟前 ⋅ 0

上海云栖:金融政企行业的CDN最佳实践

摘要: 在刚刚结束的上海云栖大会飞天技术汇分论坛上,阿里云视频云产品架构师罗小飞进行了《阿里云CDN——面向金融政企的CDN最佳实践》主题分享,为上海的嘉宾介绍CDN的解决方案与技术服务体...

猫耳m ⋅ 37分钟前 ⋅ 0

docker 基本操作

docker介绍 Docker项目提供了构建在Linux内核功能之上,协同在一起的的高级工具。其目标是帮助开发和运维人员更容易地跨系统跨主机交付应用程序和他们的依赖。Docker通过Docker容器,一个安全...

haoyuehong ⋅ 38分钟前 ⋅ 0

上海云栖:金融政企行业的CDN最佳实践

摘要: 在刚刚结束的上海云栖大会飞天技术汇分论坛上,阿里云视频云产品架构师罗小飞进行了《阿里云CDN——面向金融政企的CDN最佳实践》主题分享,为上海的嘉宾介绍CDN的解决方案与技术服务体...

阿里云云栖社区 ⋅ 40分钟前 ⋅ 0

安装与配置hadoop

一、CentOS7安装 java8,参考centos7.0 安装java1.8,tomcat 二、安装hadoop 版本V3.03 1、下载并解压hadoop # mkdir /usr/local/app# mkdir /usr/local/app/hadoop# cd /usr/local/app/had......

iturtle ⋅ 41分钟前 ⋅ 0

Idea设置Serializable自动生成

File --> Settings --> Editor --> Inspections ->Serialization issues,在该项下找到“Serializable class without 'serialVersionUID' ”并勾选...

Gmupload ⋅ 44分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部