美文网首页Javajava学习之路
spring的AOP面向切面编程使用大全

spring的AOP面向切面编程使用大全

作者: 唯有努力不欺人丶 | 来源:发表于2019-10-10 13:40 被阅读0次

    我到现在还记得两年前面试的时候死记硬背的spring知识的几句话。
    spring之所以强大不是代码上的强大,而是思维上的创新,spring的AOP与IOC是两大重点。
    今天正好在项目里看到了关于切面编程的部分,然后我也顺便回顾了一下spring的aop,并且查阅一些资料加以整理,也就是这篇文章。
    首先说一下简单的aop理解:面向切面编程,其实我觉得如果想象力够丰富应该很容易理解这个,将整个程序(由一个个接口,方法组成的)想成一个线性水管,我们所谓的aop切面就相当于一个修理工,应该做到的是想在水管哪出安一个过滤器就可以在其中切断原本的连接将过滤器加入其中。(这是我个人的理解,我记得当时看视频的时候讲师也是这么理解aop的,不过时间太久了记不太清了,自己的话说的,如果有不足欢迎指出),如果对于AOP的概念还是不太懂,我之前看了一篇文章感觉说的很详细,这里推荐给大家:AOP介绍

    继续落入实处,开始说说这个aop在spring中到底要怎么样使用。

    先说一下在spring中aop的核心概念:

    1. 横切关注点
      对哪些方法进行拦截,拦截后怎么处理,这些关注点都称之为横切关注点。(通俗点说在哪切)
    2. 切面(aspect)
      类是对物体特征的抽象,切面就是对横切关注点的抽象。(通俗点说切哪。这个和关注点是不同的,打个比方,你家要装个空调,空调装在主卧床对面的墙上。可以说你家是关注点,主卧床对面的墙是切面)
    3. 连接点(joinpoint)
      被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器
    4. 切入点(pointcut)
      对连接点进行拦截的定义
    5. 通知(advice)
      所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类(怎么切)
    6. 目标对象
      代理的目标对象

    spring中的使用

    首先第一步肯定是引包,因为我是spring boot,所以依赖:

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-aop</artifactId>
            </dependency>
    

    这里要说明一下,一般我们在日志处理中用到aop,所以引用aop大多数也引用log的那个依赖,不过这个不是必须关系,真正的aop依赖就这一个。
    第二部就是在项目中使用了。

    • 首先定义一个切面类,加上@Component @Aspect这两个注解
    • 定义切点
      先说一下切点表达式:
    @Pointcut("execution(public * io.renren.common.annotation.*.*(..))")
    public void pointCut(){}
    

    上面demo中,
    public代表是公共方法,可以不写则是所有的方法,但是不能用表示。
    第一个
    表示返回类型不限。
    第二个表示所有类。
    第三个
    表示所有方法。
    ..两个点表示方法里的参数不限。
    然后用@Pointcut切点注解在一个空方法上面,一会儿在Advice通知中,直接调用这个空方法就行了,也可以把切点表达式写在Advice通知中的,单独定义出来主要是为了好管理。
    注意切点表达式不非要是上述格式的,还有几种,这里一一介绍:

    1. execution(方法修饰符 返回类型 方法全限定名(参数)) 主要用来匹配整个方法签名和返回值的
    2. within(类路径)
      用来限定类,同样可以使用匹配符,下面用来表示com.xhx.springboot包及其子包下的所有类方法
      "within(com.xhx.springboot..*)"
    3. thistarget
      this与target在用法上有些重合,理解上有对比性。
      this表示当前切入点表达式所指代的方法的对象的实例,即代理对象是否满足this类型
      target表示当前切入点表达式所指代的方法的目标对象的实例 即是否是为target类做的代理
      如果当前对象生成的代理对象符合this指定的类型,则进行切面,target是匹配业务对象为指定类型的类,则进行切面。
    4. args(paramType)
      args无论其类路径或者是方法名是什么,表达式的作用是匹配指定参数类型和指定参数数量的方法,类型用全路径
      args(java.lang.String,..,java.lang.Integer)
    5. @within(annotationType)
      匹配带有指定注解的类,within为配置指定类型的类实例。下面匹配含有 @Component注解的类
      "@within(org.springframework.stereotype.Component)"
    6. @annotation(annotationType)
      匹配带有指定注解的方法
    7. @args(annotationType)
      @args表示使用指定注解标注的类作为某个方法的参数时该方法将会被匹配
    • Advice声明通知
      我们在想放入切点的地方放入切点了,但是想要如何切呢?比如刚刚说的安装过滤器,要过滤什么类型的肯定是要设置好的。
      spring 的AOP中通知类型有五种,其实感觉无论从名字还是从用途都比较简单。这里简单的介绍一下:
    1. @Before: 标识一个前置增强方法,相当于BeforeAdvice的功能

    2. @After: final增强,不管是抛出异常或者正常退出都会执行。

    3. @AfterReturning: 后置增强,似于AfterReturningAdvice, 方法正常退出时执行

    4. @AfterThrowing: 异常抛出增强,相当于ThrowsAdvice

    5. @Around: 环绕增强,相当于MethodInterceptor

    然后我们怎么切的话要根据业务场景,应该还蛮好判断的。这么多通知类型优先级,执行顺序也是不同的,所以这里有两张简图:


    正常执行
    异常执行

    其实自己看就能知道,两者的区别只在于最后是走@AfterReturning还是走@AfterThrowing。

    大概内容就这么多,然后参考了下面的一个帖子# spring 注解 之 AOP基于@Aspect的AOP配置

    然后本篇总结也到此为止,如果有什么忽略的知识点欢迎指出,因为我也没有专门的备案教程,都是想到哪里写哪里了。中间引用了两篇文章,都是我觉得写的不错的。我一直很感谢把自己经验分享出来的人,共同构成了面向百度学习的环境。
    全文手打不易,如果稍微帮到你了,请点个喜欢点个关注支持一下~~~~~也祝大家工作顺顺利利

    相关文章

      网友评论

        本文标题:spring的AOP面向切面编程使用大全

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