A
、
Step1
:定义业务接口与实现类
B、 Step2:定义切面类
C、 Step3:声明目标对象切面类对象
D、Step4:注册 AspectJ 的自动代理
在定义好切面
Aspect
后,需要通知
Spring
容器,让容器生成“目标类
+
切面”的代理对象。这个代理是由容器自动生成的。只需要在
Spring
配置文件中注册一个基于
aspectj
的
自动代理生成器,其就会自动扫描到
@Aspect
注解,并按通知类型与切入点,将其织入,并
生成代理。
E、 Step5:测试类中使用目标对象的 id
AspectJ 的五种通知类型
@Before
前置通知
-
方法有
JoinPoint
参数
在目标方法执行之前执行。被注解为前置通知的方法,可以包含一个
JoinPoint
类型参数。该类型的对象本身就是切入点表达式。通过该参数,可获取切入点表达式、方法签名、
目标对象等。
不光前置通知的方法,可以包含一个
JoinPoint
类型参数,所有的通知方法均可包含该
参数。
@AfterReturning 后置通知-注解有 returning 属性
在目标方法执行之后执行。由于是目标方法之后执行,所以可以获取到目标方法的返回
值。该注解的
returning
属性就是用于指定接收方法返回值的变量名的。所以,被注解为后
置通知的方法,除了可以包含
JoinPoint
参数外,还可以包含用于接收返回值的变量。该变
量最好为
Object
类型,因为目标方法的返回值可能是任何类型。
@Around
环绕通知
-
增强方法有
ProceedingJoinPoint参数
在目标方法执行之前之后执行。被注解为环绕增强的方法要有返回值,
Object
类型。并
且方法可以包含一个
ProceedingJoinPoint
类型的参数。接口
ProceedingJoinPoint
其有一个
proceed()
方法,用于执行目标方法。若目标方法有返回值,则该方法的返回值就是目标方法
的返回值。最后,环绕增强方法将其返回值返回。该增强方法实际是拦截了目标方法的执行。
接口增加方法
@AfterThrowing 异常通知-注解中有 throwing 属性
在目标方法抛出异常后执行。该注解的 throwing 属性用于指定所发生的异常类对象。 当然,被注解为异常通知的方法可以包含一个参数 Throwable,参数名称为 throwing 指定的 名称,表示发生的异常对象。
增加业务方法:
@After 最终通知
@Pointcut 定义切入点
当较多的通知增强方法使用相同的
execution
切入点表达式时,编写、维护均较为麻烦。
AspectJ
提供了
@Pointcut
注解,用于定义
execution
切入点表达式。
其用法是,将
@Pointcut
注解在一个方法之上,以后所有的
execution
的
value
属性值均
可使用该方法名作为切入点。代表的就是
@Pointcut
定义的切入点。这个使用
@Pointcut
注解
的方法一般使用
private
的标识方法,即没有实际作用的方法。