`

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

    2. **AspectJ语法**: AspectJ提供了强大的语法结构,包括`pointcut`(切点)、`advice`(通知)和`join point`(连接点)。切点定义了代码执行的特定位置,通知是在这些位置执行的代码,而连接点则是实际触发通知的...

    book :aspectj in action

    2. AspectJ语法和编程模型,包括定义切面、通知类型(before、after、around等)以及切入点表达式。 3. 如何在Java项目中引入和使用AspectJ,包括静态和动态编织的区别。 4. 利用AspectJ进行日志记录、性能监控、...

    Manning AspectJ in Action.pdf

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

    aspectj.zip

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

    Android AspectJ 使用

    三、AspectJ语法基础 1. 切面(Aspect):切面是关注点的模块化,包括通知(Advice)、切入点(Pointcut)和连接点(Join Point)。 2. 通知(Advice):在特定的连接点执行的代码,如方法调用前、后或异常发生时。 ...

    AspectJ In Action

    2. **AspectJ语法和API**:深入讲解AspectJ的语法,如定义切面、编写通知、使用切点表达式等。同时,书中还会详细介绍AspectJ的编译器和织入工具,如ajc,以及如何在Java应用中集成AspectJ。 3. **实际应用案例**:...

    AspectJ in Action

    2. **AspectJ语法**:详述了AspectJ的源码级注解(@Aspect)以及各种类型的通知,如前置通知(Before)、后置通知(After)、返回通知(After Returning)、异常通知(After Throwing)和环绕通知(Around)。...

    aspectjlib.jar.zip

    2. **AspectJ库**:aspectjlib.jar是AspectJ的核心库,它提供了一系列的API和编译器支持,使开发者可以使用AspectJ语法编写切面,然后编译为标准的Java字节码。这个库包含了类加载器、织入器以及其他必要的工具,...

    aspectjrt& aspectjweaver&aspectj&aopalliance.jar

    3. **aspectj.jar**:这个文件可能是AspectJ的完整发行版,包含了一系列的工具和库,如编译器、编译器API、加载器以及用于处理AspectJ语法的解析器等。在实际项目中,根据具体需求,可能只需要使用aspectjrt.jar和...

    spring-aop-aspectj-case

    - **AspectJ语法**:包括引入(Introduction)、注解(Annotation)和声明式通知(Declarative Advice)等,使切面定义更加直观。 - **Pointcut Expression**:AspectJ的切点表达式语言,用于精确匹配方法或类。 ...

    spring aop切面编程需要aspectjweaver-1.5.3.jar aspectj-1.9.6.jar aspectjrt-1.7.4.jar

    此外,这个库还提供了用于解析和处理AspectJ语法的API,使得开发者可以在程序中创建和管理切面。 3. **aspectjrt-1.7.4.jar**:AspectJ运行时库,它包含了运行时所需要的类和接口,如AspectJ的运行时环境、通知...

    Android+反射+代理+静态代理+AspectJ

    **AspectJ 语法**: AspectJ 提供了一种声明式的方式来定义切面,包括切点和通知。例如,以下代码会在所有 `Activity` 的 `onCreate()` 方法之前打印一条日志: ```java @Aspect public class TestAspect { @...

    AOP - Mastering AspectJ Aspect-Oriented Programming in Java(John Wiley and Sons).pdf

    **三、AspectJ语法详解** 1. **@Aspect注解**:标记一个类为切面类。 2. **@Before/@After/@Around等注解**:分别表示前置通知、后置通知和环绕通知。 3. **切点表达式**:用于指定哪些连接点应应用通知。例如,`...

    aspect.jar

    4. **AspectJ语法**:AspectJ有自己的语法,包括定义切面(Aspect)、切入点(Pointcut)、通知(Advice)等。例如,`@Aspect`注解用于标记一个类为切面,`@Before`、`@After`、`@Around`等注解定义了不同的通知类型...

    AJDT插件下载

    1. **语法高亮与错误检查**:AJDT提供AspectJ语法的高亮显示,同时在编写代码时进行实时的语法错误检查,帮助开发者尽早发现并修复问题。 2. **代码提示与完成**:在编写AspectJ代码时,AJDT会提供智能的代码补全...

    Spring动态代理第三方依赖jar.zip_aopalliance_1.0.jar_aspectjrt_aspectjweav

    当你在Spring中使用AspectJ时,这个库提供了与AspectJ语法交互的能力,使你能够编写更复杂的切面逻辑。 最后,aspectjweaver-1.7.2.jar是AspectJ的编织器,它在编译或运行时将切面代码插入到目标类中,实现了AOP的...

    Spring使用AOP的三个jar包

    即使你没有直接使用AspectJ语法编写切面,Spring的AOP代理也可以利用这个库进行代理对象的创建,以实现方法调用前后的通知(advises)。这个库对于那些希望在不改变源代码的情况下,通过AOP增强已有类的行为的开发者...

    spring2-aop入门实例教程

    - **AspectJ语法**:介绍AspectJ中切面、切入点、通知等元素的基本语法。 #### 四、Spring AOP示例 - **定义业务组件**:创建具体的业务逻辑类,这些类通常包含业务操作方法。 - **基于Schema的配置**:使用XML配置...

    aspectj-1.9.6.jar

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

Global site tag (gtag.js) - Google Analytics