AOP入门(二)

  1. 上篇文章介绍了为什么要有AOP,它的好处是什么。这篇着重介绍下AOP中的一些概念。

     

    开始前,容我吐槽下这些天杀的概念名词,起的名字非常的绕!!连Spring都在自己官方文档中申明这些名词不是Spring自己的,而且Spring也不会尝试去起自己的名词,因为那可能会更加令人晕……

    我本来不想把中文翻译的名词加到解释中去,但是,考虑到一大部分人已经习惯于用这种叫法。还是写上了。不过强烈建议直接叫英文名字,因为中文翻译更加让人confusing...

     

    Join Point   连接点

    参考http://www.eclipse.org/aspectj/doc/next/progguide/language-joinPoints.html

    里面有句话非常清楚的解释了这个名词:

    In object-oriented programs, there are several kinds of "things that happen" that are determined by the language. We call these the join points of Java. Join points consist of things like method calls, method executions, object instantiations, constructor executions, field references and handler executions. 

    也就是说,任何一个在一个类的{}里面独立存在的一行,都可以被叫做Join point,方法、构造器、实例field等。一个类,就是由这若干个point 组合而成(Java point)

     

    Point Cut 切入点

    有款游戏,叫做杀水果,相信玩过的人都知道,N个水果从屏幕下方弹出来时,你必须用一道轨迹连接所有的水果,才能把它们“杀”掉。这些水果,就是join point,而那道轨迹,正是point cut

     

    同样参考上面的连接,aspectJ的例子显然比纯Java例子更容易让人理解这是个什么东西。

    pointcut ioHandler(): within(MyClass) && handler(IOException);

    这个pintcut组合了MyClass中所有可能抛出IOExceptionjoin point

    中间一个冒号隔开。左面是pointcut的名字和其参数,右边是pointcut 自己。

    所以,pointcut说白了,就是按照某种条件归类的一组join point的合集。

     

    Advice 通知

    可以理解为一种trigger,当条件满足时触发,并通知程序新的行为。

    当到达某个join point时的通知,有如下几种触发条件:

  2. Before

    顾名思义,在执行join point前去触发

     

  3. After return

    在执行完join point返回前触发

     

  4. After throwing

    当抛出某种异常时触发

     

  5. Around

    尝试调用某个join point时执行,完全的代理join point。你可以选择执行join point,也可以选择不执行。可以在执行join pint前和后任意添加想要执行的动作。如,

    // execute anything you want before

    xxx.do();

     

    // join point execution, you can choose execute or not

    jp.do();

     

    // execute anything you want after

    xxxx.do();

     

    Aspect 切面

    Aspectpoint cut, advice和一些要用到的内部变量声明用类似于类的方式组合封装在一起。

     

    Weaving 织入

    说白了,就是将Target Object变成代理类的过程。这个代理类或许是动态proxy Spring和其他纯JAVA AOP框架一样,都是在运行时织入,类似于JDKProxy),或许是合成出来的。比如编译时合成,AspectJ就支持CTW (CompileTimeWeaving),在编译时,将aspect加到class中。LTW (LoadTimeWeaving) 是在classload的过程中合成。

    PS

    可以说EJB的注入就是一种runtimeWeaving

     

     

    最核心的就是上面几个名词,下面几个,在Spring中做了实现。而AspectJ等中,并没有一个明显的叫法。

     

    Introduction 引入

    添加方法或字段到被代理的类。在AspectJ中,被叫做Inner_type

     

    Target object

    就是代理对象

     

    AOP proxy

    AOP框架所创建出来的对象来管理aspect的绑定、advice方法的执行等。在Spring中,一个AOP proxy是一个JDKCGLIB的动态代理类。

     

     

    了解了这些概念,外面回头再看看用这些概念来描述代理过程:

  6. 创建Target object
  7. 定义join pointpoint cut
  8. 创建Aspect,里面定义不同条件的advice,将某action绑定到特定情况下的pointcut.
  9. 在编译时、加载时或runtime进行Weaving,实际外面调用的并不是Target Object,而是Weaving后生成的类。

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值