AOP已经形成了自己的术语,描述切面的常用术语有通知(advice)、切点(pointcut)和连接点(join point)。

通知(Advice)

Spring切面可以应用5种类型的通知

前置通知(Before):在目标方法被调用之前调用通知功能;

后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么;

返回通知(After-returning):在目标方法成功执行之后调用通知;

异常通知(After-throwing):在目标方法抛出异常后调用通知;

环绕通知(Around):通知包裹了被通知的方法,在被通知的方法调用之前和调用之后

执行自定义的行为。

Spring对AOP的支持

Spring提供了4种类型的AOP支持:

基于代理的经典Spring AOP;

纯POJO切面;

@AspectJ注解驱动的切面;

注入式AspectJ切面(适用于Spring各版本)。

Spring借鉴了AspectJ的切面,以提供注解驱动的AOP。本质上,它依然是Spring基于代理的AOP,但是编程模型几乎与编写成熟的AspectJ注解切面完全一致。这种AOP风格的好处在于能够不使用XML来完成功能。

通过在代理类中包裹切面,Spring在运行期把切面织入到Spring管理的bean中。如图4.3所示,代理类封装了目标类,并拦截被通知方法的调用,再把调用转发给真正的目标bean。当代理拦截到方法调用时,在调用目标bean方法之前,会执行切面逻辑。

直到应用需要被代理的bean时,Spring才创建代理对象。如果使用的是ApplicationContext的话,在ApplicationContext从BeanFactory中加载所有bean的时候,Spring才会创建被代理的对象。

框架源码 -- Spring AOP_spring

使用注解创建切面

@AspectJ注解进行了标注。该注解表明Audience不仅仅是一个POJO,还是一个切面。Audience类中的方法都使用注解来定义切面的具体行为。

Audience类:观看演出的切面

框架源码 -- Spring AOP_AOP_02

框架源码 -- Spring AOP_java_03

框架源码 -- Spring AOP_java_04

@Pointcut注解声明频繁使用的切点表达式,@Pointcut注解能够在一个@AspectJ切面内定义可重用的切点。

在XML中声明切面

框架源码 -- Spring AOP_AOP_05