Spring中的AOP有注解配置和XML配置两种,今天我们来讲一下注解配置。使用注解来创建切面是AspectJ5所引入的关键特性,使用注解可以非常简单地把任意类转换成切面。下面一起来看一下吧。
第一步:开启自动代理功能
使用注解的切面来实现aop,需要首先开启自动代理。使用注解的方式开启自动代理只需要在java配置类上添加注解@EnableAspectJAutoProxy即可。如图:
@EnableAspectJAutoProxy开启自动代理使用xml开启的话也很简单,只需在xml文件中添加<aop:aspectj-autoproxy/>即可,如图:
使用xml配置的切面则不需要<aop:aspectj-autoproxy/>,当然添加上也不会有什么影响。
第二步:定义切面
定义切面的注解为@Aspect。
AspectJ的注解可以将任一普通的java类定义为一个切面。不过首先大家要知道切面也必须是Spring管理的一个bean,所以要配置切面首先要把它配置成bean,如下图我们把一个通过自动扫描的bean设置成切面:
配置成切面这只是一个空的切面,如果要是它工作还需要配置切点和通知,下面我们来看。
第三步:定义切点
定义切点的注解为@Pointcut,如下图,我们配置了3个切点:
其中execution表示执行的意思,括号中填写的是切点表达式。上图中仅仅写了比较简单也是比较常用的一种表达式,其中selectPointCut切点的含义为:权限为public的com.example.service包和其子包内的所有类的select方法,select方法的参数不限制,即只要是方法名为select就会被切点匹配到。
第四步:定义通知
通知定义了切面的行为,它包含了这个行为什么时候执行以及做什么。通知的类型包含以下几种:
@Before:在目标方法执行前执行通知;
@After:在目标方法执行后执行通知,无论是正常返回还是异常返回都会执行;
@AfterReturning:在目标方法执行完成后执行通知;
@AfterThrowing:在目标方法抛出异常后执行通知;
@Around:可在目标方法执行前后自定义通知行为;
这几个注解都有一个value属性,用于指定切点。可以直接在value中指定切点表达式也可以在value中引用已经存在的切点表达式,如下图
上图中Before类型的通知直接在value中定义了切点,其他类型的通知则引用了已经定义好的切点。
Around类型的通知可以接收一个ProceedingJoinPoint类型的参数,当执行joinPoint.proceed();后目标方法才会执行。
AfterThrowing类型的通知可以通过throwing属性来指定异常的名称,通过这个名称在通知方法上来接收异常。
如何在通知中接收传给目标方法的参数
这一点单独列出来说明一下,在通知中接收传给目标方法的参数有时候是很必要的,如果能接收到传给目标方法的参数,通知就可以根据目标方法的参数的值进行相应的处理,从而丰富通知的行为。那么具体怎么实现呢?其实也很简单,我们一起来看下。
假如我们的目标方法如下:
目标方法要想通知中能够接收到目标方法的参数需要做到以下四点:
第一点:切点要准确匹配到目标方法的参数。这一点是通过在切点表达式中的“&&”操作符和“args”来实现的;
第二点:在定义切点的方法上要定义参数,这些参数的名称要和args里面的参数名称一致,不过顺序可以不一致。
第三点:定义通知时引用的切点方法要正确引用到切点方法的参数,也就是像正常调用一个方法那样,否则编译也会报错。
第四点:通知的方法参数名称要和通知引用的切点的参数名称一样,顺序可以不一样。
如下图的切点和通知:
切点和通知这样就可以在通知中获取到传给目标方法的参数了。
总结
本文主要讲解了注解配置aop的方式,只要分为四步,另外还介绍了通知如何获取异常和参数的方式。希望能够帮助大家,小伙伴们如果有疑问可以在评论区留言哦。
网友评论