springnodejs

我要开发同款
匿名用户2014年03月14日
83阅读

技术信息

授权协议
GPL

作品详情

sprigodejs============1.只需要添加 wsCotroller文件就行,启动自动注入Cotroller2.path路径参数,请求参数自动注入3.请求参数格式转换,可扩展转换类型4.容器变量字段自动注入5.容器初始化执行6.aop实现方法拦截7.url拦截分发反正是就仿sprig那套写起文档,发觉很不容易,大家将就一下吧框架来源:本来想拿odejs做个ip查询小应用的,做的时候想着把基础弄好再做应用,没想到做着做着就变成sprig了个人感觉自己做出来的东西还是挺牛的,国内应该没有人做吧用JS写个sprig出来,哈哈,我就是牛至于sprig是什么,大家上网搜下吧我在这里简单介绍一下几个核心概念。由于我本人水平也有限,对于程序的理解也只能在这水平,还没达到深层次,有什么错的请回馈下。IOC:反转控制--------------------传统写代码方式如:```vara={  b:{},  c:{},  d:{}}vard={  da:'xxx',  db:'ccc',}//如果我要用A来工作,是不是先将A对象的属于全部初始化才能工作啊??a.b=b.da;a.c=b.db;....a.z=b.z```大家请思考,如果我要完成一个功能,需要七八个模块,每个模块平均要用到四五个服务/控制类,每个服务/控制类又要用到其它的服务/控制还有再加上三四个配置资源,到最后每个类都有一大堆的属性要初始化,整个项目共有二三十模块。如果让人去管理的话会疯掉,如果这些都用程序来管理,那是件多么轻松的事啊说真的至于ioc怎么实义我也不了解概念,我不是学JAVA的,我只知道他的存在至少帮我处理完以上的事件。那好,现在怎么用程序来做上面海量工作的事情呢?请看JS简单实现ioc```varar=[];//容器1varo1={  id:'o1',  o2:ull}//容器2varo2={  id:'o2',  o1:ull}ar.push(o1);ar.push(o2)varioc={}//注册容器for(variiar){  varobj=ar[i];  ioc[obj.id]=obj;}//容器属性自动注入for(variiioc){  varobj=ioc[i];  for(varjiobj){    if(j!='id'){      obj[j]=ioc[j];    }  }}cosole.log(ioc,o1,o2)```没错,就是这么简单。每个容器都有自己的ID标识,只要用来搜索定位,防止复盖。下面是项目的核心处理AppCotext对象用来管理项目所有的容器,那么主有就几个工作方法:生成ID,查找容器,注册容器,查找一堆相同类型容器等具体的规则请看代码实现吧```AppCotext={    getKey:fuctio(key){      key=key.trim();      key=key[0].toLowerCase()+key.substrig(1,key.legth);      returkey;    },    fidCotaier:fuctio(key){      key=this.getKey(key);      returthis.data[key];    },    addCotaier:fuctio(id,cotaier){      id=this.getKey(id);      cotaier.id=id;      if(this.data[id]!=ull){        _error("ijectiokeyishas:",id);        retur;      }      this.data[id]=cotaier;    },    fidIjectioOfType:fuctio(iclude,exclude,callBack){      for(variithis.data){        varcotaier=this.data[i];        if(cotaier.ijectioType==ull){          cotiue;        }        varijectioType=cotaier.ijectioType;                 if(iclude!=ull&&iclude.idexOf(ijectioType)<0){          cotiue;        }                 if(exclude!=ull&&exclude.idexOf(ijectioType)>-1){          cotiue;        }                 callBack(cotaier);        }    },    data:{}  }```现在来说下注册容器一些流程:1.scaioc2.auto ijectiofield3.iitru1.首先要注明那些是可以注册的,那些是要过滤掉的,那些容器是分别是什么类型。如核心或者服务,控制,或者工作,或者是配置等等最后注入的条件是什么啊等等一大堆问题要处理,程序员就是命苦,生来解决这些的2.注入完成后,接下来就是自动注入属性,我用声明式标识来定义那些是可以注入的,请看示例```{  auto_field1:ull,  auto_field3:ull,  auto_field4:ull,  auto_field5:ull,  auto_field6:ull,  auto_field20:ull,  postCostruct:fuctio(){  debug('iit=========================================');  }};```通过auto_(容器ID) 来注入3.注入完了,我们来个初化始来完成自己准备工作大概流程可以抽象出三个方法```_sca();_auto_ijectio_field();_iit(); ```  自动扫描,大家用JQUERY都知道吧,$('CSS选择器')这样就扫描到一大堆DOM对象$('id')$('class')我总结了一下用声明式标记那些对象/文件可以是被扫描到的下面请看项目代码实现扫描配置 ```varappCofig={  /**autoscacofig**/    sca:{    './core':{      ijectioType:'core'    },    './cofig':{      ijectioType:'cofig'    },    './aop':{      ijectioType:'aop'    },    './service':{      ijectioType:'service'    },    './ws':{      filter:'\\ws',//url服务过滤器      ijectioType:'cotroller',      //iclude:[],      exclude:['./ws/test/test1.js']    }  } }; ```有没有注意到ijectioType这个属于?我目前是按目录来分配容器类型的。这些大家可以在这里扩展自己的容器类型,注入后期。通过AppCotext.fidIjectioOfType扫描下面是项目实现ioc流程```var_ijectio=fuctio(filePath,cotaier){  varid=cotaier.id;  if(id==ull){    id=_path.baseame(filePath).replace('.js','');        }     cotaier.filePath=filePath;     AppCotext.addCotaier(id,cotaier);     returcotaier;}var_auto_ijectio_field=fuctio(){  for(varidiAppCotext.data){    if(id=='appCotext'){      cotiue;    }    varcotaier=AppCotext.fidCotaier(id);         for(varfieldicotaier){      if(field.idexOf('auto_')==0){               varcheckF=cotaier[field];        if(typeofcheckF=='fuctio'){          cotiue;        }        varijectioKey=field.replace('auto_','');                 if(AppCotext.fidCotaier(ijectioKey)==ull){          _error('ijectiofieldotfidid:',field,id);        }else{          cotaier[field]=AppCotext.fidCotaier(ijectioKey);                  debug("ijectiofield:",ijectioKey,id)        }            }          }      }}var_iit=fuctio(){  //为什么分三个初始化阶段呢    //postCostruct为应用层初始化,如果做服务层扩展的话,就要在应用层初始化之前准备工作,这下明了吧  for(varidiAppCotext.data){    varcotaier=AppCotext.fidCotaier(id);    cotaier.awake!=ull&&cotaier.awake(AppCotext);  }     for(varidiAppCotext.data){    varcotaier=AppCotext.fidCotaier(id);    cotaier.start!=ull&&cotaier.start(AppCotext);  }     for(varidiAppCotext.data){    varcotaier=AppCotext.fidCotaier(id);    cotaier.postCostruct!=ull&&cotaier.postCostruct(AppCotext);  }}var_sca=fuctio(){  webHelper.scaProcess(appCofig.sca,'.js',fuctio(filePath,target){    varcotaier=require(filePath);          //ijectioType查找过滤用的         if(cotaier.ijectioType==ull){      varijectioType=target.ijectioType;      if(ijectioType==ull){        ijectioType='service';      }      cotaier.ijectioType=ijectioType;    }         //addfilter过滤器    if(target.filter!=ull){      cotaier.filter=target.filter;    }         varijectioType=cotaier.ijectioType;    varid=_ijectio(filePath,cotaier).id;    debug("ijectio:",'[',ijectioType,']','[',id,']',filePath);  });}_sca();_auto_ijectio_field();_iit();```AOP拦截面向切面编程--------------------第一次听说估计疯了吧,呵呵也包括我我先来引导一下:我们写的代码最终变成```a();b();c();d();```CPU从上往下读取执行,最小单位抽象为方法大家请思考一下,程序流是从上往下执行的,如果到了项目后期,要添加某些功能,变成如下这样,那我是不是得修改原来的文件啊,这样会破坏原来的代码,可能会产生未知的BUG,这是程序员最担心受怕的事```a();e();b();c();d();```以上代码如果变成```a();ewF=fuctio(){e();b();}ewF();c();d();orewF=fuctio(){a();e();}ewF();b();c();d();```这样是不是不用破坏原来的代码啊? 这就是面向切向编程,是的没什么高深的,找到执行的关键点,切入自己处理的逻辑,在切入点之前执行还是之后执行,甚至扩展抛异常执行等等------------这就是AOP的核心思想,我不明白所有的书籍为什么不会写中文??如果你玩过widow程序钩子,是不是觉得有点似类??还有一个应用是改变原来执行方法的输入参数/输出返回这在数据类型转换应用很扩。举例:```vara=fuctio(ita,Dateb){returitc;}ewa=fuctio(ita,strigb){b=Date.str2date(b);varc=a(a,b);returc+'';}aop.filter(if(calla?)callewa;);```我看过一些书籍,程序补丁就是这样玩的下面是项目aop实现代码:先看AOP应用:```module.exports={before:{'TestService.testAop':fuctio(origialFucto,callObj,args){cosole.log('aopthisistestAopbefore==================');cosole.log('aoptestthisvalue',this.testFiled);cosole.log('aopargumets:',origialFucto,args);}},after:{'TestService.testAop':fuctio(){//TestService是要拦截的容器,testAop是拦截的方法cosole.log('aopthisistestAopafter==================');}}, 'testFiled':'testFiled',postCostruct:fuctio(){cosole.log('aoppostCostruct');},preDestroy :fuctio(){cosole.log('preDestroy');}};```aop核心JS```/** *@authorsolq *@deprecatedblog:cblogs.com/solq **/vardebug=require('../core/util/debug.js').debug,_error=require('../core/util/debug.js').error;module.exports={awake:fuctio(AppCotext){var$this=this;AppCotext.fidIjectioOfType(ull,ull,fuctio(cotaier){$this.register(cotaier,AppCotext);});},//publicregister:fuctio(cotaier,AppCotext){for(varkeyicotaier.before){ varfilter=cotaier.before[key];this._aop(key,'before',filter,cotaier,AppCotext); }for(varkeyicotaier.after){varfilter=cotaier.after[key];this._aop(key,'after',filter,cotaier,AppCotext); }for(varkeyicotaier.error){varfilter=cotaier.error[key];this._aop(key,'error',filter,cotaier,AppCotext); }},//private_aop:fuctio(key,aopType,filter,thisObj,AppCotext){varsp=key.split('.'),id=sp[0],fName=key.substrig(key.idexOf('.')+1,key.legth);varcotaier=AppCotext.fidCotaier(id);if(cotaier==ull){_error("aopotfidcotaier:",key,"id:",id);retur;}varorigialFucto=ull;try{origialFucto=eval('cotaier.'+fName);}catch(e){_error(e);_error("aopotfidorigialFucto:",key,"id:",id);retur;} if(origialFucto==ull){_error("aopotfidorigialFucto:",key,"id:",id);retur;}if(typeoforigialFucto!="fuctio"){_error("aoporigialFuctoisotfuctio",key,"id:",id);retur;}varewFutio=ull;switch(aopType){case'error':ewFutio=fuctio(){try{origialFucto.apply(cotaier,argumets);}catch(e){filter.apply(thisObj,argumets);}}break;case'after':ewFutio=fuctio(){varresult=origialFucto.apply(cotaier,argumets);filter.apply(thisObj,argumets);returresult;}break;case'before':ewFutio=fuctio(){//debug("origialFucto:",origialFucto.toStrig());varisCallFlag=filter.call(thisObj,origialFucto,cotaier,argumets);if(!isCallFlag){returorigialFucto.apply(cotaier,argumets);}}break;}cotaier[fName]=ewFutio;}};```声明式开发------------我第一次见别人写java注解就完成开发了,感觉太写意哈哈.举例之前auto_标识```{auto_field1:ull,auto_field2:ull,auto_field3:ull,auto_field4:ull,}```也可以多种声明```{'/testpathParam/{p1}/{p2}':{ cotroller:fuctio(path_it_p2,path_p1,param_def_array_p1){cosole.log("testpathParam",argumets);}}}```param_def_array_三种声明绑定一个属性由于JS语言没有java@注解我只有能想到用标识+_来做程序处理,看起来有点怪怪的哈哈上面这个是REST设计风格,下面会介绍的只要声明程序预处理的时候帮你自动注了,你也可以自定义标识对应相应处理```{"声明1":"处理器1","声明2":"处理器2","声明3":"处理器3","声明4":"处理器4",}```我总结了一下,用声明式开发只在是在程序预处理的时候,为了减少程序逻辑的复杂性,加标识扫描处理,类型声明转换,添加处理器等。这种好处也只能在预处理阶段应用很好,如果在应用层做的话就失去优势。大家思考一下:本来是为了减少程序复杂性用人工去硬写入绑定,如果在应用层大量用声明的话,绝对是苦力活。我看到有的UI框架把HTML做成声明式,那绝对是苦力活,本来用js动态生成HTML干掉HTML化,他反而要把功能声明依赖HTML想到一个页面有多少个HTML标签就想死了REST设计风格------------好了,目前就写在这里

功能介绍

springnodejs ============ 1.只需要添加 ws Controller 文件就行,启动自动注入 Controller 2.path 路径参数,请求参数自动注入 3.请求参...

声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论