在本节将学习Spring AOP的用法和一些高级的AOP主题,如通知优先权(Advice precedence)和引入(Introduction)
使用Spring AOP的核心实现技术在所有版本中都一样:动态代理;因为AspectJ已经成长为一个完整流行的AOP框架,Spring在其AOP框架中支持使用AspectJ注解编写POJO aspect。但是在Spring AOP中使用AspectJ aspect有一些限制,因为Spring只允许aspect应用到IOC容器中申明的Bean。如果你希望这个范围之外的应用aspect,就必须使用AspectJ款那个价。
启用Spring的AspectJ注解支持
在Bean配置文件中定义<aop:aspectj-autoproxy/>
他讲自动为匹配AspectJ aspect的Bean创建代理。
用Aspect注解编写的aspect只是一个带有@Aspect注解的Java类。通知(Advice)是带有一个通知注解的简单简单Java方法。AspectJ支持5种通知注解:@Before、@After、@AfterReturning、@AfterThrowing和@Around。
前置通知
切入点匹配的执行点称为连接点(JoinPoint),切入点是匹配一组连接点的表达式,而通知是特定连接点采取的行动。
最终通知
后置通知(after advice)在连接点结束之后执行,不管返回结果还是抛出异常。一个aspect可以包含一个或多个通知。
后置通知
最终通知不管连接点正常返回还是抛出异常都执行,如果希望仅当连接点返回时记录,应该用后置通知(after returning advice)替换最终通知。在后置通知(@AfterReturning)注解中添加一个returning属性,访问连接点返回值。然后,你必须用这个名称通知方法的签名中添加一个参数,在运行时,Spring AOP通过这个参数传入返回值,注意切入点表达式要在pointcut属性中表现。
@AfterReturning(pointcut = "execution(* Arithmeticalculator.add(..))",
returning = "result")
public void logAfterReturning(JoinPoint joinPoint,Object result){
log.info(joinPoint.getSignature().getName()+"() ends with "+result);
}
异常通知
@AfterThrowing,当且仅当连接点抛出异常时执行。可通过throwing属性来访问。Throwable类型是Java语言只能怪所有错误和异常的超类。
环绕通知
around advice,是所有通知类型中最强大的。它获得连接点的完全控制,这样可以在一个通知总组合的使用前面的所有行为,甚至可以控制合适以及是否继续原来的连接点执行。注意,对于环绕通知,连接点参数类型必须是ProceedingJoinPoint。这是JoinPoint的一个子接口,允许你控制何时继续原始连接点。
@Around("execution(* *.*(..))")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
//do something
Object result = joinPoint.proceed();
log.info("The method "+joinPoint.getSignature().getName()+"() ends with "+result);
return result;
}
环绕通知类型非常强大和灵活,甚至可以修改原始参数值和最后返回值。你必须非常小心的使用这一通知,因为很容易忘记继续原始的连接点
访问连接点信息