仓酷云
标题:
来看用Java静态代办署理完成AOP
[打印本页]
作者:
愤怒的大鸟
时间:
2015-1-18 11:28
标题:
来看用Java静态代办署理完成AOP
主要缺点就是:速度比较慢,没有C和C++快
今朝全部开辟社区对AOP(AspectOrientedPrograming)推许备至,也出现出大批撑持AOP的优异Framework,--Spring,JAC,JbossAOP等等。AOP仿佛一时之间成了潮水。Java初学者不由要收回感伤,OOP还没有学通呢,又来AOP。本文不是要在实际上详细论述作甚AOP,为什么要举行AOP.要具体懂得进修AOP能够到它故乡http://aosd.net往瞧瞧。这里只是企图经由过程一个复杂的例子向初学者展现一下怎样来举行AOP.
为了复杂起见,例子没有无利用任何第三方的AOPFramework,而是使用Java言语自己自带的静态代办署理功效来完成AOP.
让我们先回到AOP自己,AOP次要使用于日记纪录,功能统计,平安把持,事件处置等方面。它的次要企图就要将日记纪录,功能统计,平安把持等等代码从贸易逻辑代码中分明的分别出来,我们能够把这些举动一个一个独自看做体系所要办理的成绩,就是所谓的面向成绩的编程(不知将AOP译作面向成绩的编程是不是不当)。经由过程对这些举动的分别,我们但愿能够将它们自力地设置到贸易办法中,而要改动这些举动也不必要影响到贸易办法代码。
假定体系由一系列的BusinessObject所完成营业逻辑功效,体系请求在每次营业逻辑处置时要做日记纪录。这里我们略往详细的营业逻辑代码。
publicinterfaceBusinessInterface{
publicvoidprocessBusiness();
}
publicclassBusinessObjectimplementsBusinessInterface{
privateLoggerlogger=Logger.getLogger(this.getClass().getName());
publicvoidprocessBusiness(){
try{
logger.info("starttoprocessing...");
//businesslogichere.
System.out.println(“hereisbusinesslogic”);
logger.info("endprocessing...");
}catch(Exceptione){
logger.info("exceptionhappends...");
//exceptionhandling
}
}
}
这里处置贸易逻辑的代码和日记纪录代码夹杂在一同,这给往后的保护带来必定的坚苦,而且也会形成大批的代码反复。完整不异的log代码将呈现在体系的每个BusinessObject中。
依照AOP的头脑,我们应当把日记纪录代码分别出来。要将这些代码分别就触及到一个成绩,我们必需晓得贸易逻辑代码什么时候被挪用,如许我们好拔出日记纪录代码。一样平常来讲要截获一个办法,我们能够接纳回调办法大概静态代办署理。静态代办署理一样平常要加倍天真一些,今朝多半的AOPFramework也多数接纳了静态代办署理来完成。这里我们也接纳静态代办署理作为例子。
JDK1.2今后供应了静态代办署理的撑持,程序员经由过程完成java.lang.reflect.InvocationHandler接口供应一个实行处置器,然后经由过程java.lang.reflect.Proxy失掉一个代办署理对象,经由过程这个代办署理对象来实行贸易办法,在贸易办法被挪用的同时,实行处置器会被主动挪用。
有了JDK的这类撑持,我们所要做的仅仅是供应一个日记处置器。
publicclassLogHandlerimplementsInvocationHandler{
privateLoggerlogger=Logger.getLogger(this.getClass().getName());
privateObjectdelegate;
publicLogHandler(Objectdelegate){
this.delegate=delegate;
}
publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{
Objecto=null;
try{
logger.info("methodstats..."+method);
o=method.invoke(delegate,args);
logger.info("methodends..."+method);
}catch(Exceptione){
logger.info("Exceptionhappends...");
//excetpionhandling.
}
returno;
}
}
如今我们能够把BusinessObject内里的一切日记处置代码全体往失落了。
publicclassBusinessObjectimplementsBusinessInterface{
privateLoggerlogger=Logger.getLogger(this.getClass().getName());
publicvoidprocessBusiness(){
//businessprocessing
System.out.println(“hereisbusinesslogic”);
}
}
客户端挪用贸易办法的代码以下:
BusinessInterfacebusinessImp=newBusinessObject();
InvocationHandlerhandler=newLogHandler(businessImp);
BusinessInterfaceproxy=(BusinessInterface)Proxy.newProxyInstance(
businessImp.getClass().getClassLoader(),
businessImp.getClass().getInterfaces(),
handler);
proxy.processBusiness();
程序输入以下:
INFO:methodstats...
hereisbusinesslogic
INFO:methodends...
至此我们的第一次小实验算是完成了。能够看到,接纳AOP以后,日记纪录和营业逻辑代码完整分隔了,今后要改动日记纪录的话只必要修正日记纪录处置器就好了,而营业对象自己(BusinessObject)无需做任何修正。而且这个日记纪录不会形成反复代码了,一切的贸易处置对象都能够重用这个日记处置器。
固然在实践使用中,这个例子就显得太粗拙了。因为JDK的静态代办署理并没有间接撑持一次注册多个InvocationHandler,那末我们对营业处置办法既要日记纪录又要功能统计时,就必要本人做一些变通了。一样平常我们能够本人界说一个Handler接口,然后保护一个行列寄存一切Handler,当InvocationHandler被触发的时分我们顺次挪用本人的Handler。所幸的是今朝几近一切的AOPFramework都对这方面供应了很好的撑持.这里保举人人利用Spring。
主要缺点就是:速度比较慢,没有C和C++快
作者:
小魔女
时间:
2015-1-21 07:43
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
作者:
乐观
时间:
2015-1-26 16:49
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
作者:
山那边是海
时间:
2015-2-3 19:48
自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。
作者:
冷月葬花魂
时间:
2015-2-9 04:27
是一种使用者不需花费很多时间学习的语言
作者:
精灵巫婆
时间:
2015-2-26 21:18
当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
作者:
莫相离
时间:
2015-3-8 17:57
Java 编程语言的风格十分接近C、C++语言。
作者:
若天明
时间:
2015-3-11 10:18
还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。
作者:
分手快乐
时间:
2015-3-18 04:22
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2