Spring框架入门必备教程-AOP面向切面编程(下篇)

AspectJ 基于注解的 AOP 实现
AspectJ 提供了以注解方式对于AOP 的实现。
(1) 实现步骤
A、 Step1:定义业务接口与实现类


B、Step2:定义切面类
类中定义了若干普通方法,将作为不同的通知方法,用来增强功能。

C、Step3:声明目标对象切面类对象

D、 Step4:注册 AspectJ 的自动代理
在定义好切面Aspect 后,需要通知 Spring 容器,让容器生成“目标类+ 切面”的代理对象。这个代理是由容器自动生成的。只需要在 Spring 配置文件中注册一个基于aspectj 的自动代理生成器,其就会自动扫描到@Aspect 注解,并按通知类型与切入点,将其织入,并生成代理。

<aop:aspectj-autoproxy/>的底层是由AnnotationAwareAspectJAutoProxyCreator 实现的。从其类名就可看出, 是基于AspectJ 的注解适配自动代理生成器。
其工作原理是,<aop:aspectj-autoproxy/>通过扫描找到@Aspect 定义的切面类,再由切面类根据切入点找到目标类的目标方法,再由通知类型找到切入的时间点。
E、 Step5:测试类中使用目标对象的 id

(2) [掌握]@Before 前置通知-方法有 JoinPoint 参数
在目标方法执行之前执行。被注解为前置通知的方法,可以包含一个JoinPoint 类型参数。该类型的对象本身就是切入点表达式。通过该参数,可获取切入点表达式、方法签名、目标对象等。
不光前置通知的方法,可以包含一个JoinPoint 类型参数,所有的通知方法均可包含该参数。

(3) [掌握]@AfterReturning 后置通知-注解有 returning 属性
在目标方法执行之后执行。由于是目标方法之后执行,所以可以获取到目标方法的返回值。该注解的returning 属性就是用于指定接收方法返回值的变量名的。所以,被注解为后置通知的方法,除了可以包含 JoinPoint 参数外, 还可以包含用于接收返回值的变量。该变量最好为 Object 类型,因为目标方法的返回值可能是任何类型。
接口增加方法:

实现方法:

定义切面:

(4) [掌握]@Around 环绕通知-增强方法有ProceedingJoinPoint 参数
在目标方法执行之前之后执行。被注解为环绕增强的方法要有返回值, Object 类型。并且方法可以包含一个ProceedingJoinPoint 类型的参数。接口ProceedingJoinPoint 其有一个proceed()方法,用于执行目标方法。若目标方法有返回值,则该方法的返回值就是目标方法的返回值。最后,环绕增强方法将其返回值返回。该增强方法实际是拦截了目标方法的执行。
接口增加方法:

定义切面:

(5) [了解]@AfterThrowing 异常通知-注解中有 throwing 属性
在目标方法抛出异常后执行。该注解的throwing 属性用于指定所发生的异常类对象。当然,被注解为异常通知的方法可以包含一个参数 Throwable,参数名称为throwing 指定的名称,表示发生的异常对象。
增加业务方法:

方法实现:

定义切面:

(6) [了解]@After 最终通知
无论目标方法是否抛出异常,该增强均会被执行。
增加方法:

方法实现:

定义切面:

(7) @Pointcut 定义切入点
当较多的通知增强方法使用相同的execution 切入点表达式时,编写、维护均较为麻烦。AspectJ 提供了@Pointcut 注解,用于定义execution 切入点表达式。
其用法是,将@Pointcut 注解在一个方法之上,以后所有的execution 的value 属性值均可使用该方法名作为切入点。代表的就是@Pointcut 定义的切入点。这个使用@Pointcut 注解的方法一般使用private 的标识方法,即没有实际作用的方法。

最后奉上视频教程👇,视频观看效果更佳!!走过路过别忘素质三连哦~~

