`
zyl
  • 浏览: 486277 次
社区版块
存档分类
最新评论

关于AspectJ 中的pointcut 语法

    博客分类:
  • AOP
阅读更多
   这两天忙着看AspectJ in Action 为了补一下AOP知识。看了Spring 2.0的规范,其中AOP部分已经基本融合了AspectJ,看来有必要看一看AspectJ了。
   看了很多AOP的文章了,AOP这两年发展的很慢,没有什么新意,现在到处都是SOA,SCA了,不过研究了一下,觉得还是很有帮助的。尤其是增加系统的契约性和模块的独立性来说,很有帮助。
   当然,学东西,基础很重要。下面就说说AspectJ中的基本语法,有兴趣的可以看看AspectJ in Action。
   先来说说pointcut,从字面的意思说的是切面的意思。也就是横切的时候,会有哪些执行点会被识别。只有先识别了,才能执行相应的Advice。
   基本的定义如下:
 
   public pointcut accountOperations:call(* Account.*(..))
 
   1.通配符和pointcut 操作符

    *    *  表示任何数量的字符,除了(.)
    *     .. 表示任何数量的字符包括任何数量的(.)
    *        + 描述指定类型的任何子类或者子接口

    同java一样,提供了一元和二元的条件表达操作符。
    一元操作符:!
      二元操作符:||和&&
      优先权同java

      2.签名语法

  类型签名样式

  主要的例子:
  Account                              类型Account
    *Account                             使用Account名称结束的类型,如SavingsAccount和CheckingAccount
    java.*.Date                         类型Date在任何直接的java子包中,如java.util.Date和java.sql.Date
    java..*                                 任何在java包或者所有子包中的类型,如java.awt和java.util或者java.awt.event 和java.util.logging
    javax..*Model+                   所有javax包或者子包中以Model结尾的类型和其所有子类,如TableModel,TreeModel。
  !vector                             所有除了Vector的类型
  Vector|| Hashtable              Vector或者Hashtable类型
  java.util.RandomAccess+    实现RandomAccess和List的所有子类
   && java.util.List+
 
   方法和构造器签名模式

  public void Collection.clear():
  在Collection中同样签名的clear方法

  public void Account.debit(float) throws InsufficientBalanceException:
  Account中同样签名的debit方法

  public void Account.set*(*)
  Account中以set开头,并且只有一个参数类型的方法

  public void Account.*()
  Account中所有的没有参数的public void 方法

  public * Account.*()
  Account中所有没有参数的public 方法

  public * Account.*(..)
  Account中所有的public 方法

  * Account.*(..)
  Account中的所有方法,包括private方法

  !public * Account.*(..)
  所有的非public 方法

   * Account+.*(..)
   所有的方法,包括子类的方法

   * java.io.Reader.read(..)
   所有的read方法

   * java.io.Reader.read(char[],..)
   所有以read(char[])开始的方法,包括read(char[])和read(char[],int,int)

   * javax..*.add*Listener(EventListener+)
   命名以add开始,以Listener结尾的方法,参数中为EventListener或子类

   * *.*(..) throws RemoteException
   抛出RemoteException的所有方法

   构造器,同上面
   public Account.new()
   没有参数的构造器方法

    属性签名模式
    同方法一样,属性也查不多
    * Account.*  
    所有的Account属性

    !public static * banking..*.*
    所有的非public static 属性,在banking的包或者子包中
  
    3.主要的pointcuts类型
 
    分类pointcuts
    遵循特定的语法用于捕获每一个种类的可使用连接点。
    主要的种类:

    * 方法执行:execution(MethodSignature)
    * 方法调用:call(MethodSignature)
    * 构造器执行:execution(ConstructorSignature)
    * 构造器调用:call(ConstructorSignature)
    * 类初始化:staticinitialization(TypeSignature)
    * 属性读操作:get(FieldSignature)
    * 属性写操作:set(FieldSignature)
    * 例外处理执行:handler(TypeSignature)
    * 对象初始化:initialization(ConstructorSignature)
    * 对象预先初始化:preinitialization(ConstructorSignature)
    * Advice执行:adviceexecution()

   基于控制流的pointcuts
   主要包括两种类型的控制流:
   cflow(Pointcut),捕获所有的连接点在指定的方法执行中,包括执行方法本身。
   cflowbelow(Pointcut),捕获所有的连接点在指定的方法执行中,除了执行方法本身。

   如以下的例子:
   cflow(call(* Account.debit(..))
   所有的debit方法中的连接点,包括debit方法本身
   cflowbelow(call(* Account.debit(..))
   所有debit方法中的连接点,除了debit方法本身
   cflow(transactedOperations())
   所有由transactedOperations捕获的连接点
   cflowbelow(execution(Account.new(..))
   所有在Account 构造器中执行的连接点

   基于词汇结构的连接点
   源代码片断。,如within()和withincode()
   within :捕获在指定类或者方面中的程序体中的所有连接点,包括内部类。
   Withincode:用于捕获在构造器或者方法中的所有连接点,包括在其中的本地类

   执行对象连接点
   匹配this,和target对象,作为方法被调用的对象。
   this(Account),所有Account的实例的执行点,匹配所有的连接点,如方法调用,属性设置,当前的执行对象为Account,或者其子类。
   target(Account):匹配所有的连接点,目标对象为Account或其子类。

   必须执行相应的类型,不能使用*,或者..通配符。当前静态方法,不能被匹配。

   在within()和this()中的区别:
   一个是程序体,而另一个为对象执行。

   参数pointcuts
   用于捕获参数类型的连接点。
   args(String,..,int)
   args(RemoteException)

   条件检测pointcuts
   if(System.currentTimeMillis()>triggerTime)


   基本的语法就这些,不过AspectJ5 已经增加了不少语法,主要关于Annotation 的,不过这部分还没有仔细研究,以后再讲解吧。希望能有所帮助
分享到:
评论
1 楼 zhangchunyin 2008-12-23  

相关推荐

    跟我学Spring3(6.5)AspectJ切入点语法详解

    在本篇内容中,我们将深入探讨Spring框架中的一个重要概念——AspectJ切入点语法,这是Spring AOP(面向切面编程)的核心部分。通过学习这一章节,您可以掌握如何在Spring3中利用AspectJ的强大功能来实现更加灵活和...

    AspectJ 文档

    Pointcut是AspectJ中用于捕获一组特定连接点的表达式。通过Pointcut,我们能够定义切面应该被应用在哪些连接点上。Pointcut可以基于方法名、方法参数类型、注解等条件来定义。例如,使用execution关键字可以匹配特定...

    详解Spring 框架中切入点 pointcut 表达式的常用写法

    在Spring框架中,切入点(pointcut)表达式是AOP(面向切面编程)的核心组成部分,用于定义关注点的精确位置,比如哪些方法应该被拦截。切入点表达式是基于AspectJ语法的,允许开发者精确地指定要拦截的方法。下面将详细...

    关于AspectJ的比较简要的PPT

    AspectJ是一种面向切面编程(Aspect-Oriented Programming, AOP)的扩展语言,它通过提供一种新的语法结构来支持AOP特性,使开发者能够更清晰地分离关注点,并在编译时或运行时动态地将横切关注点(cross-cutting ...

    aspectj的有关知识点

    以下是一些关于 Pointcut 的基本语法和操作符: 1. 通配符和 Pointcut 操作符: - `*` 代表任何数量的字符,除了 `.`。 - `..` 表示任意数量的字符,包括 `.`,用于表示包或类层次结构。 - `+` 描述指定类型的...

    Aspectj

    本指南将深入探讨AspectJ的核心概念、语法以及如何在实际项目中应用。 1. **面向切面编程(AOP)**: AOP是软件工程中的一种编程范式,旨在减少代码的冗余和提高可维护性。通过分离关注点,将横切关注点(如日志、异常...

    aspectj-1.9.6.jar

    3. **AspectJ语言**:AspectJ提供了一套强大的声明式语法,用于定义切点、通知以及它们之间的关系。例如,`@Before`、`@After`、`@Around`等注解用于定义不同类型的通知。 4. **类型安全的切面**:AspectJ在编译时...

    aspectJ

    同时,熟悉AspectJ的语法和工具,如ajc编译器和AspectJ Weaver,能让你在实际项目中更好地应用面向方面的编程。最后,实践是检验理论的最好方式,尝试在实际项目中引入AspectJ,解决实际问题,将有助于你深入理解和...

    AspectJ面向切面的例子

    AspectJ作为Java的AOP实现,提供了一套完整的语法,包括切点(pointcut)、通知(advice)、切面(aspect)等概念,允许开发者精确地指定何时何地执行特定的代码。 在压缩包"Spacewar Example"中,可能包含以下内容...

    aspectj-1.6.9.jar

    2. **语法支持**:AspectJ 提供了自己的扩展语言,称为AspectJ语言(AJ),它扩展了Java语法,允许开发者声明切面、切入点和通知。 3. **API**:`aspectj-1.6.9.jar` 包含了AspectJ的API,开发者可以通过这些API在...

    pointcut表达式and or not在xml中配置

    在Spring AOP中,Pointcut表达式通常使用AspectJ的表达式语法。这些表达式允许开发者指定何时执行AOP的增强功能。以下是一些基本的Pointcut表达式语法: - **execution()**:用于匹配方法执行。 - `execution(* ...

    aspectj,aspectjrt,weaver等

    AspectJ、AspectJRT 和 AspectWeaver 是三个与面向切面编程(AOP)相关的关键组件,它们在Spring框架中有着重要应用,尤其对于初学者来说,理解这些概念是掌握Spring AOP的基础。 AspectJ 是一个强大的Java语言的...

    Aop之AspectJ详解解读demo

    AspectJ是一个完整的AOP系统,它扩展了Java语言,引入了新的语法来定义切面和连接点(join points)。切面是关注点的模块化,而连接点是程序执行的特定点,如方法调用或异常处理。AspectJ通过切点(pointcut)来指定...

    aspectj-1.8.8.jar

    AspectJ提供了丰富的语法来定义切面,包括切入点(Pointcut)和通知(Advice)。切入点是切面关注点的具体定位,可以是方法调用、异常抛出等特定行为;通知则是执行的具体操作,可以在切入点匹配时被触发。例如,...

    spring aspectj.jar

    AspectJ提供了强大的语法,允许开发者声明性地定义切点(Pointcut)、通知(Advice)和切面。AspectJ的编译器或加载器可以在编译时或运行时进行织入,确保切面代码正确地与应用程序代码结合。 AspectJ的`aspectrt....

    Manning AspectJ in Action.pdf

    2. **AspectJ语法和API**:详细解析AspectJ的语法,包括如何定义切面、编写通知,以及如何定义切点表达式。同时,也会介绍AspectJ提供的API,如`@Aspect`注解、`@Before`、`@After`、`@Around`等通知类型。 3. **织...

    aspectj-1.8.13-src.jar

    5. **语法和注解**:AspectJ 提供了独特的语言扩展,如 `@Aspect` 注解用于标记切面类,`@Before`、`@After` 等注解用于声明通知,以及 `@Pointcut` 定义切入点。此外,还有 `@Around` 和 `@AfterThrowing` 等高级...

    aspectj+aspectjrt+aspectjweaver

    - **切点表达式(Pointcut Expression)**:切点表达式是AspectJ中的特殊语法,用于精确匹配代码中的特定位置。例如,`execution(* com.example.service.*.*(..))`匹配com.example.service包下的所有方法。 - **...

    aspectj.zip

    6. **AspectJ语法**:学习AspectJ特有的语言特性,如`@Aspect`注解、`@Before`、`@After`等。 7. **集成开发环境支持**:了解如何在Eclipse或IntelliJ IDEA等IDE中配置AspectJ支持,以及如何使用AJDT(AspectJ ...

Global site tag (gtag.js) - Google Analytics