`

AspectJ语法

阅读更多

这两天忙着看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名称结束的类型,如SavingsAccountCheckingAccount
java.*.Date 类型Date在任何直接的java子包中,如java.util.Datejava.sql.Date
java..* 任何在java包或者所有子包中的类型,如java.awtjava.util或者java.awt.event java.util.logging
javax..*Model+ 所有javax包或者子包中以Model结尾的类型和其所有子类,如TableModel,TreeModel
vector 所有除了Vector的类型
Vector|| Hashtable Vector或者Hashtable类型
java.util.RandomAccess+ 实现RandomAccessList的所有子类
&& 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 的,不过这部分还没有仔细研究,以后再讲解吧。希望能有所帮助

分享到:
评论

相关推荐

    SpringAOPAspectJ切入点语法详解

    SpringAOPAspectJ切入点语法详解

    AspectJ 文档

    Aop框架AspectJ 的语法介绍JPoint Pointcut Signature

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

    跟我学Spring3(6.5)AspectJ切入点语法详解Java开发Java经验技巧共10页.pdf.zip

    AspectJ 1.9 jar 源码

    AspectJ 1.9 最新1.9第二版,包含源码。AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件

    Spring.3.x企业应用开发实战(完整版).part2

    7.4 @AspectJ语法基础 7.4.1 切点表达式函数 7.4.2 在函数入参中使用通配符 7.4.3 逻辑运算符 7.4.4 不同增强类型 7.4.5 引介增强用法 7.5 切点函数详解 7.5.1 @annotation() 7.5.2 execution() 7.5.3 args()...

    Spring3.x企业应用开发实战(完整版) part1

    7.4 @AspectJ语法基础 7.4.1 切点表达式函数 7.4.2 在函数入参中使用通配符 7.4.3 逻辑运算符 7.4.4 不同增强类型 7.4.5 引介增强用法 7.5 切点函数详解 7.5.1 @annotation() 7.5.2 execution() 7.5.3 args()...

    aspectj开发包

    AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。

    Summer:Spring原始码学习过程中的模仿小项目,希望做出一个迷你版的Spring来,学习过程会不断更新

    破烂循环依赖,写一堆烂代码... 参考文档: : 参考内容: : 关于参数名称的问题:如果... AspectJ语法解析: : list PLDcmCgguL9rxPoVn2ykUFc8TOpLyDU5gx自己写了个自动机 9.11修正了AOP的过程,但是还是和原始不一样

    aspectj.jar

    AspectJ定义了AOP语法所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件. AspectJ(也就是AOP)的动机是发现那些使用传统的编程方法无法很好处理的问题。考虑一个要在某些应用中实施安全策略的问题...

    aspectj-1.7.2

    AspectJ定义了AOP语法所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件. AspectJ(也就是AOP)的动机是发现那些使用传统的编程方法无法很好处理的问题。考虑一个要在某些应用中实施安全策略的...

    跟我学spring3(1-7).pdf

    —— 5.1 概述 5.2 SpEL基础5.3 SpEL语法5.4在Bean定义中使用EL6.1 AOP基础6.2 AOP的HelloWorld6.3 基于Schema的AOP6.4 基于@AspectJ的AOP 6.5 AspectJ切入点语法详解6.6 通知参数6.7 通知顺序6.8 切面实例化模型

    frabbuccino:使用 AHEAD 工具套件构建的用于 Java 和 AspectJ 的可扩展编译器

    它专门设计用于支持语法、语义、优化传递等扩展。abc 已被用于各种研究项目,以探索在 AspectJ 中实际实现的想法。什么是星冰乐? Frabbuccino 的目标是采用 abc 并证明它可以通过使用对其进行重构而变得更可扩展、...

    框架中常用的jar包作用

    用于在Spring 2.0中集成AspectJ AspectJ LTW织入器 ognl.jar OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以...

    如何使用Spring Boot的@Pointcut注解

    我们首先介绍了@Pointcut注解的作用和其在AspectJ框架中的重要性。然后,我们详细解释了@Pointcut注解的语法和常用的切点表达式规则。 为了帮助读者更好地理解@Pointcut注解的实际应用,我们提供了一个完整的Spring...

    AJDT插件下载

    AJDT是一个eclipse插件,开发aspectj必装,他可以提供语法检查,以及编译。

    跟我学spring3(1-7)

    【第六章】 AOP 之 6.5 AspectJ切入点语法详解 ——跟我学spring3 【第六章】 AOP 之 6.6 通知参数 ——跟我学spring3 【第六章】 AOP 之 6.7 通知顺序 ——跟我学spring3 【第六章】 AOP 之 6.8 切面实例化模型 ...

    flance#spring-framework-reference-5.1.3#5.5.基于模式的AOP支持1

    因此,在本节中,我们将重点放在新语法上,并将读者引用到上一节(@AspectJ支持)中的讨论,以了解编写切入点表达式和建议参数的绑定。要使用本节中描述的aop命

    spring2.5学习PPT 传智博客

    20.aspectj的切入点语法定义细节 21.搭建和配置Spring与jdbc整合的环境 22.Spring集成的jdbc编码和事务管理 23.使用Spring注解方式管理事务与传播行为详解 24.使用Spring配置文件实现事务管理 25.搭建和配置...

Global site tag (gtag.js) - Google Analytics