• 2004-08-20

    简单介绍AspectJ的高级特性(二)

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://befresh.blogbus.com/logs/339330.html

    三、Aspect association

    在Java中,为了节省对象每次构建的耗费,增加效率,很多人会考虑使用Singleton模式,让jvm中只有一个实例存在。AspectJ当然为我们考虑到这个问题,Aspect association实际上就是aspect与advised join point object的一种关联关系,这很类似于OO中association,譬如1:1,1:m等。Aspect association能让我们能更好地控制aspect的状态信息。

    在AspectJ中可以把Aspect association大致分为三类:

    1、Per virtual machine (default)

    一个jvm中只有一个aspect instance,AspectJ默认association。

    2、Per object

    每一个advised join point object都会产生一个aspect instance,不过同一个object instance只会产生一个aspect instance。

    3、Per control-flow association

    这种association稍微复杂一些,它主要针对程序调用的控制流,譬如:A方法调用B方法,B方法又调用C方法,这就是control-flow。

    在aspect中声明这三种association非常简单,它的主要语法如下:

    aspect <AspectName> [<association-specifier>(<Pointcut>)] {
    ... aspect body
    }

    Per virtual machine是aspectj的默认association,不需要你额外的声明,正常使用即可。

    Per object主要有两种方式:perthis()和pertarget()。perthis()主要用于execution object,pertarget()主要用于target object,两者非常类似。

    Per control-flow中也包含两种方式:percflow()和percflowbelow()。这两者也很类似,只是两者的control-flow不太一样而已。

    维护aspect的状态信息还有一种方法,就是使用introduce。可以在aspect中introduce member fields,通过fields来保存状态信息。


    收藏到:Del.icio.us




    引用

    下面Blog引用了该文: