![16018e206b00a3b0e848718a98ac7e4b.png](https://img-blog.csdnimg.cn/img_convert/16018e206b00a3b0e848718a98ac7e4b.png)
Spring中的AOP有注解配置和XML配置两种,今天我们来讲一下注解配置。使用注解来创建切面是AspectJ5所引入的关键特性,使用注解可以非常简单地把任意类转换成切面。下面一起来看一下吧。
第一步:开启自动代理功能
无论是基于注解的aop还是基于xml的aop,都需要首先开启自动代理。使用注解的方式开启自动代理只需要在java配置类上添加注解@EnableAspectJAutoProxy即可。如图:
![9a7e08f155be9027f2fabe5c46493190.png](https://img-blog.csdnimg.cn/img_convert/9a7e08f155be9027f2fabe5c46493190.png)
使用xml开启的话也很简单,只需在xml文件中添加<aop:aspectj-autoproxy/>即可,如图:
![f18c90249d7985078f75a48b2f371088.png](https://img-blog.csdnimg.cn/img_convert/f18c90249d7985078f75a48b2f371088.png)
第二步:定义切面
定义切面的注解为@Aspect。
AspectJ的注解可以将任一普通的java类定义为一个切面。不过首先大家要知道切面也必须是Spring管理的一个bean,所以要配置切面首先要把它配置成bean,如下图我们把一个通过自动扫描的bean设置成切面:
![03e46ffb37a8496fe6ccd4bf79a5cff9.png](https://img-blog.csdnimg.cn/img_convert/03e46ffb37a8496fe6ccd4bf79a5cff9.png)
这只是一个空的切面,如果要是它工作还需要配置切点和通知,下面我们来看。
第三步:定义切点
定义切点的注解为@Pointcut,如下图,我们配置了3个切点:
![f529731c844ee6a2b40d7048250fbe51.png](https://img-blog.csdnimg.cn/img_convert/f529731c844ee6a2b40d7048250fbe51.png)
其中execution表示执行的意思,括号中填写的是切点表达式。上图中仅仅写了比较简单也是比较常用的一种表达式,其中selectPointCut切点的含义为:权限为public的com.example.service包和其子包内的所有类的select方法,select方法的参数不限制,即只要是方法名为select就会被切点匹配到。
第四步:定义通知
通知定义了切面的行为,它包含了这个行为什么时候执行以及做什么。通知的类型包含以下几种:
@Before:在目标方法执行前执行通知;
@After:在目标方法执行后执行通知;
@AfterReturning:在目标方法执行完成后执行通知;
@AfterThrowing:在目标方法抛出异常后执行通知;
@Around:可在目标方法执行前后自定义通知行为;
这几个注解都有一个value属性,用于指定切点。可以直接在value中指定切点表达式也可以在value中引用已经存在的切点表达式,如下图
![00003a76a3e677ce57612909ea0c1d4b.png](https://img-blog.csdnimg.cn/img_convert/00003a76a3e677ce57612909ea0c1d4b.png)
上图中Before类型的通知直接在value中定义了切点,其他类型的通知则引用了已经定义好的切点。
Around类型的通知可以接收一个ProceedingJoinPoint类型的参数,当执行joinPoint.proceed();后目标方法才会执行。
AfterThrowing类型的通知可以通过throwing属性来指定异常的名称,通过这个名称在通知方法上来接收异常。
以上就是今天的关于注解配置AOP的方法,小伙伴们如果有疑问可以在评论区留言哦!