仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 849|回复: 19
打印 上一主题 下一主题

[学习教程] JAVA网页设计dojo1.7功效先容:面向方面编程(AOP)功效与道理仓酷云

[复制链接]
若天明 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:29:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
还是要自己一点一点写代码,然后编译,改错再编译好那。还有最重要的是.net网页编程的编译环境非常好,你甚是不需要了解太多工具,对于简单的系统,你可以之了解一些语法就哦了。日前公布的dojo1.7版本对其源码举行了很年夜的变动。在迈向2.0版本之际,dojo供应了很多新的功效,也对很多已有的功效举行了修正,详细来讲新版本更好地撑持AMD标准、供应了新的事务处置体系(企图在2.0版本中交换dojo.connectAPI)和DOM查询模块、更新对象存储相干接口(ObjectStore)等。在本文中我们将会先容在dojo1.7版本中新增的面向方面编程(AOP)功效和实在现道理。
1.简介

AOP即面向方面编程,是面向对象编程头脑的持续。使用该头脑剥离一些通用的营业,能够无效下降营业逻辑间的耦合度,进步程序的可重用性。跟着Java范畴中Spring框架的盛行,其倡议的AOP理念被更多的人所熟悉(要注重的是Spring并非该头脑的创始者,但说Spring框架的盛行让更多人懂得和进修了AOP头脑其实不为过)。由于Java为静态言语,以是在完成AOP功效时较为庞大,一样平常接纳两种体例即静态代办署理和字节码天生手艺(如CGLib)来完成该功效。在JavaScript范畴,由于之前模块化需求并非很激烈,以是AOP的理念并没有被普遍引进出去。可是跟着RIA手艺的开展,愈来愈多的营业逻辑在前台完成,JavaScript代码的构造和可保护性更加主要,恰是在如许的背景下,呈现了良多JavaScript模块化办理的类库,而dojo也在这方面主动探究,新版本的dojo已更好地撑持AMD标准,并供应了面向方面编程的撑持。
在面向方面编程功效推出之前,dojo能够经由过程利用connect办法来完成相似的功效。connect办法次要能够完成两类功效即为dom对象绑定事务和为已有的办法增加后置办法。已有很多文章剖析dojo的connect办法的利用和道理,再加上dojo企图在未来版本中移除该API,以是在此不合错误这个办法举行更仔细的剖析了。
2.dojo的aspect模块利用简介

在dojo1.7的版本中新增了aspect模块,该模块次要用来完成AOP的功效。借助于此项功效能够为某个对象的办法在运转时增加before、after或around范例的加强(advice,即要实行的切面办法)。为了先容此功效,我们先用dojo的类机制声明一个复杂的类:
  1. define("com.levinzhang.Person",["dojo/_base/declare"],function(declare){declare("com.levinzhang.Person",null,{name:null,age:null,constructor:function(name,age){this.name=name;this.age=age;},getName:function(){returnthis.name;},getAge:function(){returnthis.age;},sayMyself:function(){alert("Personsnameis"+this.getName()+"!");}});})
复制代码
这里声明类的办法,与我们在先容类机制时略有分歧,由于dojo从1.6版本入手下手撑持AMD标准,经由过程define办法来声明模块及其依附干系。有了类今后,我们必要创立一个实例,以下:
  1. dojo.require("com.levinzhang.Person");varperson=newcom.levinzhang.Person("levin",30);
复制代码
如今我们要借助dojo的aspect模块为这个类的实例增加AOP功效。假定我们必要在sayMyself办法的挪用前后分离增加对另外一个办法的挪用(即所谓的加强advice),示例代码以下:
  1. varaspect=dojo.require("dojo.aspect");//引进aspect模块//声明在person的sayMyself办法挪用前要挪用的办法varsignal=aspect.before(person,"sayMyself",function(){alert("挪用了before");});//声明在person的sayMyself办法挪用后要挪用的办法aspect.after(person,"sayMyself",function(){alert("挪用了after");});//此时挪用sayMyself办法将会前后打印出://“挪用了before”、“Personsnameislevin!”、“挪用了after”//即依照before、方针办法、after的按次实行person.sayMyself();
复制代码
在以上的代码片断中,我们利用了aspect的before和after办法完成了在方针办法前后增加advice。在挪用before和after办法后将会前往一个signal对象,这个对象纪录了方针advice并供应了移除办法,如要移除上文增加的beforeadvice,只需实行以下代码:
  1. signal.remove();//移除后面增加的beforeadvice//此时挪用sayMyself办法将会前后打印出://“Personsnameislevin!”、“挪用了after”//即经由过程aspect.before增加的办法已被移除person.sayMyself();
复制代码
除before和after范例的advice,dojo还撑持around范例的advice,在这类情形下,必要前往一个function,在这个function中能够增加恣意的营业逻辑代码并挪用方针办法,示例代码以下:
  1. varsignal=aspect.around(person,"sayMyself",function(original){returnfunction(){alert("beforetheoriginalmethod");original.apply(person,arguments);//挪用方针办法,即原始的sayMyself办法alert("aftertheoriginalmethod");}});//此时挪用sayMyself办法将会前后打印出://“beforetheoriginalmethod”、“Personsnameislevin!”、“aftertheoriginalmethod”person.sayMyself();
复制代码
从下面的示例代码我们能够看到,around范例的advice会有更多对营业逻辑的把持权,原始的方针办法会以参数的情势传送出去,以便在advice中举行挪用。
经由过程对以上几品种型advice利用体例的先容,我们能够看到dojo的AOP功效在JavaScript中完成了AOPAlliance所倡议的advice范例。必要指出的是,每品种型的advice都可增加多个,dojo会依照增加的按次顺次实行。
3.完成道理

懂得了dojoAOP功效的基础语法后,让我们剖析一下实在现道理。dojoaspect模块的完成在dojo/aspect.js文件中,全部文件的代码数在100行摆布,因而实在现是相称简便高效的。
经由过程varaspect=dojo.require("dojo.aspect");办法引进该模块时,会失掉一个复杂的JavaScript对象,我们挪用aspect.before、aspect.around、aspect.after时,均会挪用该文件中界说的aspect办法所前往的function。
  1. define([],function(){……return{before:aspect("before"),around:aspect("around"),after:aspect("after")};});
复制代码
如今我们看一下aspect办法的完成:
  1. functionaspect(type){//关于分歧范例的advice均前往此办法,只不外type参数会有所分歧returnfunction(target,methodName,advice,receiveArguments){varexisting=target[methodName],dispatcher;if(!existing||existing.target!=target){//经由AOP处置的办法均会被一个新的办法所交换,也就是这里的dispatcherdispatcher=target[methodName]=function(){//beforeadvicevarargs=arguments;//失掉第一个before范例的advicevarbefore=dispatcher.before;while(before){//挪用before范例的adviceargs=before.advice.apply(this,args)||args;//找到下一个before范例的advicebefore=before.next;}//挪用around范例的adviceif(dispatcher.around){挪用dispatcher.around的advice办法varresults=dispatcher.around.advice(this,args);}//失掉第一个after范例的advicevarafter=dispatcher.after;while(after){//挪用after范例的adviceresults=after.receiveArguments?after.advice.apply(this,args)||results:after.advice.call(this,results);//找到下一个after范例的adviceafter=after.next;}returnresults;};if(existing){//设置最后的around范例的advice,即挪用方针办法dispatcher.around={advice:function(target,args){returnexisting.apply(target,args);}};}dispatcher.target=target;}//关于分歧范例的advice,通用advise办法来修正dispatcher,即对象的同名办法varresults=advise((dispatcher||existing),type,advice,receiveArguments);advice=null;returnresults;};}
复制代码
我们能够看到,在第一次挪用aspect办法时,原本的方针办法会被交换成dispatcher办法,而在这个办法中会依照外部的数据布局,顺次挪用各类范例的advice和最后的方针办法。而构建和调剂这个外部数据布局是经由过程advise办法来完成的:
  1. functionadvise(dispatcher,type,advice,receiveArguments){varprevious=dispatcher[type];//失掉指定范例的前一个advicevararound=type=="around";varsignal;if(around){//对around范例的advice,只需挪用advice办法,并将上一个advice(有大概即为//方针办法)作为参数传进便可varadvised=advice(function(){returnprevious.advice(this,arguments);});//构建前往的对象,即aspect.around办法的前往值signal={//移除办法remove:function(){signal.cancelled=true;},advice:function(target,args){//即为真正实行的around办法returnsignal.cancelled?previous.advice(target,args)://作废,跳至下一个advised.apply(target,args);//挪用后面的advised办法}};}else{//关于after或before范例的advice,构建移除办法signal={remove:function(){varprevious=signal.previous;varnext=signal.next;if(!next&&!previous){deletedispatcher[type];}else{if(previous){previous.next=next;}else{dispatcher[type]=next;}if(next){next.previous=previous;}}},advice:advice,receiveArguments:receiveArguments};}if(previous&&!around){if(type=="after"){//将新增的advice加到列表的尾部varnext=previous;while(next){//移到链表尾部previous=next;next=next.next;}previous.next=signal;signal.previous=previous;}elseif(type=="before"){//将新增的advice增加到肇端地位dispatcher[type]=signal;signal.next=previous;previous.previous=signal;}}else{//around范例的advice或第一个advicedispatcher[type]=signal;}returnsignal;}
复制代码
以上,我们剖析了dojo的aspect模块的利用和完成道理,只管这类将静态言语编程作风移植到剧本言语中的做法可否被人人承受并普遍利用另有待工夫的查验,但这类实验和完成体例仍是很值得自创的。
参考材料



  • http://livedocs.dojotoolkit.org/
  • http://dojotoolkit.org/
关于作者

张卫滨,存眷企业级Java开辟和RIA手艺,团体博客:http://lengyun3566.iteye.com,微博:http://weibo.com/zhangweibin1981

Java编译的是字节码,跟C++相反,启动不够快,效率不够高,难以精确控制内存,但是优点是编程比C++容易,代码比较安全但是容易留下性能隐患,跨平台靠字节码在各个平台复制(一处编译到处调试)
兰色精灵 该用户已被删除
沙发
发表于 2015-1-21 07:51:57 | 只看该作者
一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。
金色的骷髅 该用户已被删除
板凳
发表于 2015-1-24 12:58:09 | 只看该作者
有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)
若天明 该用户已被删除
地板
 楼主| 发表于 2015-1-28 10:46:13 来自手机 | 只看该作者
《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。
老尸 该用户已被删除
5#
发表于 2015-1-28 19:38:03 | 只看该作者
你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?
飘灵儿 该用户已被删除
6#
发表于 2015-2-1 18:39:47 | 只看该作者
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
若相依 该用户已被删除
7#
发表于 2015-2-7 13:26:10 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
小魔女 该用户已被删除
8#
发表于 2015-2-8 18:53:47 | 只看该作者
是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言
分手快乐 该用户已被删除
9#
发表于 2015-2-12 22:57:11 | 只看该作者
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
柔情似水 该用户已被删除
10#
发表于 2015-2-27 05:14:07 | 只看该作者
有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)
admin 该用户已被删除
11#
发表于 2015-3-2 11:13:06 | 只看该作者
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
再见西城 该用户已被删除
12#
发表于 2015-3-4 10:26:57 | 只看该作者
是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言
爱飞 该用户已被删除
13#
发表于 2015-3-13 01:08:33 | 只看该作者
是一种使网页(Web Page)产生生动活泼画面的语言
因胸联盟 该用户已被删除
14#
发表于 2015-3-13 04:09:43 | 只看该作者
自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。
活着的死人 该用户已被删除
15#
发表于 2015-3-19 16:45:39 | 只看该作者
你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。
精灵巫婆 该用户已被删除
16#
发表于 2015-3-20 06:40:14 | 只看该作者
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
莫相离 该用户已被删除
17#
发表于 2015-3-25 11:43:12 | 只看该作者
是一种将安全性(Security)列为第一优先考虑的语言
18#
发表于 2015-3-27 20:08:40 | 只看该作者
那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!
变相怪杰 该用户已被删除
19#
发表于 2015-3-31 02:53:18 | 只看该作者
那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!
不帅 该用户已被删除
20#
发表于 2015-4-2 10:29:09 | 只看该作者
应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-4-28 07:26

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表