AOP里面3个概念Advice,PointCut,Advisor(转载)

来源:互联网 发布:javascript 算法可视化 编辑:程序博客网 时间:2024/05/19 02:16

本文转自:http://blog.donews.com/shanyou/archive/2005/04/16/338539.aspx

处理逻辑(Advice):在某个连接点所采用的处理逻辑。

切点(PointCut):一系列连接点的集合,它指明处理方式(Advice)将在何处被触发,可以使用正则表达式表达。

Advisor:是PointCut和Advice的综合体,完整描述了一个advice将会在pointcut所定义的位置被触发。

附注:

AOP全名Aspect
-Oriented Programming,我们先来看看XXX-Oriented的意义,通常翻译「XXX导向」,也就是以XXX为中心,例如中文中「客户导向」就是以客户为中心,而「对象导向」(OOP:Object-Oriented Programming)就是以对象为中心的程序设计。
  自然的,Aspect
-Oriented Programming,就是「Aspect导向程序设计」,也就是以Aspect为中心的程序设计,但什么是Aspect?中文直译通常是「方面」,但这个名词容易使人混淆。
  牛津字典中的英英解释对Aspect是:particular part or feature of sth being considerd

  所以Aspect在英文中不只有「方面」的意思,还有部份(part)的意思。中文中称「就这个方面来说」,通常指的是「就这个角度来说」或「就这个方向来说」,这个解释不适用于AOP中的Aspect。如果英文中说from this aspect of sth,除了可以翻译为上面两句的意义之外,还可以翻作「就这个部份来说」。
  以我们的前一个主题中的记录(log)动作插入至HelloSpeaker对象的hello
()中为例,我们说「就记录这个部份」是不属于HelloSpeaker职责的,它被硬生生切入HelloSpeaker中,英文中我们可以说:The logging aspect of the "hello" method doesn't belong to the job of HelloSpeaker.
  所以以整个方法的执行流程来说,如果执行流程是纵向的,则记录这个动作硬生生的「横切」入其中,这个横切入的部份我们就称之为Aspect,它是横切关注点(crosscutting concern,一个concern可以像是权限检查、事务等等)的模块化,将那些散落在对象中各处的程序代码聚集起来。
  所以Aspect要用中文表达的话,适切一些的名词该是「横切面」或「切面」。AOP关注于Aspect,将这些Aspect视作中心进行设计,使其中从职责被混淆的对象中分离出来,除了使原对象的职责更清楚之外,被分离出来的Aspect也可以设计的通用化,可运用于不同的场合。
  来看事务管理这个Aspect如何在动态代理下被抽取出来,下面是一个简单的概念,基本上是在Handler中先激活事务,执行存储层动作,方法执行成功则提交(commit),失败则回滚(rollback):
  代码




TransactionHandler.java 



public class TransactionHandler implements InvocationHandler 



    
private Object delegate



  



    
public Object bind(Object obj) { 



        
this.delegate obj



        
return Proxy.new ProxyInstance(.., .., ..); 



     } 



    
public Object invoke(Object proxyMethod methodObject[] args) { 



        
Object result null



  



         ..... 



  



        
YourTransaction transaction null



        
try 



            
transaction yourMethodForGettingTransaction(); 



  



            
result method.invoke(delegateargs); 



  



            
transaction.commit(); 



         } 



        
catch(YourException e) { 



            
if(transaction != null) { 



                
try 



                    
transaction.rollback(); 



                 } 



                
catch(Exception e) {} 



             } 



         } 



  



         .... 



  



        
return result



     } 







  在AOP中,有好几个关键的概念,然而其中更主要的是:PointCut、Advice与Advisor。这些术语并不是很直观,我们配合我们上一个主题的HelloSpeaker来说明会比较容易理解。 
  PointCut是JointPoint的集合,JointPoint是指Aspect加入的阶段点,例如某个方法被调用,某个成员被存取(Spring不支持),或是某个例外被丢出,以我们前一个主题的HelloSpeaker为例,hello
()方法就是一个JointPoint。PointCut为JointPoint的集合,意味着多个方法或例外丢出可以使用同一个处理建议(Advice)。 
  Advice是在JointPoint上所要调用的处理建议(在JointPoint上所采取的动作,许多AOP框架通常以interceptor来实作Advice,之后会介绍),例如记录、事务处理、权限检查等。 
  Advice类型(advice type)有Around、Before、Throws、After returning。这些Advice类型会分别在以下的时机被调用:在JointPoint前后、JointPoint前、JointPoint丢出例外时、JointPoint执行完毕后。 
  就我们上一个例子来说,我们在hello
()这个JointPoint上会调用Around Advice,即我们的LogHandler。事务管理调用的Advice类型也是属于Around Advice,即上面的TransactionHandler,调用的JointPoint可能是某个DAO对象的saveXXX()方法。 
  Advisor将PointCut与Advice组合在一起,我们前一个主题中的HelloSpeaker例子很简单,故而没有使用到Advisor,之后会介绍到Advisor。 
  补充:动态代理是比较常见的AOP实作策略,在《Expert One
-on-One J2EE Development WIthout EJB》 Rod Johnson、Juergen Hoeller中的第八章中有提到,AOP的实作有五个主要的策略: 



Dynamic Proxies 

Dynamic Byte Code Generation 

Java Code Generation 

Use of a Custon Class Loader 

Language Extensions




Trackback
http://tb.donews.net/TrackBack.aspx?PostId=338539

原创粉丝点击