概述
【IT168 专稿】在《基于@AspectJ配置Spring AOP(之一)》的文章中,我们讲解基于@AspectJ Spring AOP的基础知识,在本文中,我们将继续学习@AspectJ一些高级的知识。@AspectJ可以使用逻辑运算符对切点进行复合运算得到复合的切点;为了在切面中重用切点,我们还可以对切点进行命名,以便在其它的地方引用定义过的切点;当一个连接点匹配多个切点时,需要考虑织入顺序的问题;此外,一个重要的问题是如何在增强中访问连接点上下文的信息。
切点复合运算
使用切点复合运算符,我们将拥有强大而灵活的切点表达能力,以下是一个使用了复合切点的切面:
代码清单 7 TestAspect:切点复合运算
在①处,我们通过&&运算符定义了一个匹配com.baobaotao包中所有greetTo方法的切点;在②处,我们通过!和&&运算符定义了一个匹配所有serveTo()方法并且该方法不位于NaiveWaiter目标类的切点;在③处,我们通过||运算符定义了一个匹配Waiter和Seller接口实现类所有连接点的切点。package com.baobaotao.aspectj.advanced;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class TestAspect ...{
@After("within(com.baobaotao.*) "
+ " && execution(* greetTo(..)))") ①与运算
public void greeToFun() ...{
System.out.println("--greeToFun() executed!--");
}
![]()
@Before(" !target(com.baobaotao.NaiveWaiter) "+
"&& execution(* serveTo(..)))") ②非与运算
public void notServeInNaiveWaiter() ...{
System.out.println("--notServeInNaiveWaiter() executed!--");
}
@AfterReturning("target(com.baobaotao.Waiter) || "+
" target(com.baobaotao.Seller)") ③或运算
public void waiterOrSeller()...{
System.out.println("--waiterOrSeller() executed!--");
}
}
