|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
主要缺点就是:速度比较慢,没有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++快 |
|