美文网首页Spring专题
Spring中如何使用注解配置AOP?

Spring中如何使用注解配置AOP?

作者: 自律赢 | 来源:发表于2019-11-18 20:58 被阅读0次

    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的方式,只要分为四步,另外还介绍了通知如何获取异常和参数的方式。希望能够帮助大家,小伙伴们如果有疑问可以在评论区留言哦。

    相关文章

      网友评论

        本文标题:Spring中如何使用注解配置AOP?

        本文链接:https://www.haomeiwen.com/subject/bkfiictx.html