Declaring Advice
有如下三类增强:
@Before
@After
@Around
环绕通知运行 around 匹配方法的执行。它有机会在方法运行之前和之后都工作,并确定方法实际运行何时、如何甚至是否执行。若你需要以线程安全的方式(例如启动和停止计时器)在方法执行前后共享状态,则通常会使用Around advice。
使用案例:
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.ProceedingJoinPoint; @Aspect public class AroundExample { @Around("com.xyz.myapp.CommonPointcuts.businessService()") public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable { // start stopwatch Object retVal = pjp.proceed(); // stop stopwatch return retVal; } }
around advice 返回的值就是方法调用者看到的返回值。例如,一个简单的缓存aspect可以返回一个值从缓存(如果它有)或调用procedd如果它没有。请注意,可以多次调用procedd,或者根本不在around advice的主体内调用,这都是合法的。
推荐始终使用最不强大的advice形式,以满足需求。
使用 @Around 注解声明环绕通知时,第一个参数必须是ProceedingJoinPoint类型。
在通知的方法体中,调用 proceed() 会导致基础方法运行。 proceed() 也可以在Object[]中传递。数组中的值在进行时用作方法执行的参数。
Advice参数
Spring 提供全种类的通知,这意味着你在通知的方法签名中声明所需参数,而非和Object[]
协作。
如何编写通用的通知,以便了解通知方法当前在通知啥玩意。
Access to the Current JoinPoint
任何通知方法都可能声明类型org.aspectj.lang.JoinPoint 的参数(请注意,围绕建议需要申报类型’继续JoinPoint’的第一参数,该参数是 JoinPoint 的子类。
JoinPoint 接口提供了许多有用的方法:
getArgs()
返回方法的参数
getThis()
返回代理对象
getTarget()
返回目标对象
getSignature()
Returns a description of the method that is being advised.
toString()
Prints a useful description of the method being advised.