Spring AOP原理分析

什么是AOP?

Spring AOP原理分析

在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程
* AOP是一种编程范式,隶属于软工范畴,指导开发者如何组织程序结构
* AOP最早由AOP联盟的组织提出的,制定了一套规范.Spring将AOP思想引入到框架中,必须遵守AOP联盟的规范
* 通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术
* AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型
* 利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率

为什么使用AOP?

  • 作用:

AOP采取横向抽取机制,补充了传统纵向继承体系(OOP)无法解决的重复性代码优化(性能监视、事务管理、安全检查、缓存)
将业务逻辑和系统处理的代码(关闭连接、事务管理、操作日志记录)解耦。

  • 优势:

重复性代码被抽取出来之后,维护更加方便

  • 纵向继承体系:
    Spring AOP原理分析
  • 横向抽取机制:
    Spring AOP原理分析

AOP相关术语介绍

术语解释

Joinpoint(连接点) – 所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点
Pointcut(切入点) – 所谓切入点是指我们要对哪些Joinpoint进行拦截的定义
Advice(通知/增强) – 所谓通知是指拦截到Joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)
Introduction(引介) – 引介是一种特殊的通知在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field
Target(目标对象) – 代理的目标对象
Weaving(织入) – 是指把增强应用到目标对象来创建新的代理对象的过程
Proxy(代理) – 一个类被AOP织入增强后,就产生一个结果代理类
Aspect(切面) – 是切入点和通知的结合,以后咱们自己来编写和配置的
Advisor(通知器、顾问) --和Aspect很相似

图示说明

Spring AOP原理分析

AOP实现之AspectJ(了解)

AspectJ是一个Java实现的AOP框架,它能够对java代码进行AOP编译(一般在编译期进行),让java代码具有AspectJ的AOP功能(当然需要特殊的编译器)
可以这样说AspectJ是目前实现AOP框架中最成熟,功能最丰富的语言。更幸运的是,AspectJ与java程序完全兼容,几乎是无缝关联,因此对于有java编程基础的工程师,上手和使用都非常容易。
了解AspectJ应用到java代码的过程(这个过程称为织入),对于织入这个概念,可以简单理解为aspect(切面)应用到目标函数(类)的过程。
对于织入这个过程,一般分为动态织入和静态织入,动态织入的方式是在运行时动态将要增强的代码织入到目标类中,这样往往是通过动态代理技术完成的,如Java JDK的动态代理(Proxy,底层通过反射实现)或者CGLIB的动态代理(底层通过继承实现),Spring AOP采用的就是基于运行时增强的代理技术
ApectJ采用的就是静态织入的方式。ApectJ主要采用的是编译期织入,在这个期间使用AspectJ的acj编译器(类似javac)把aspect类编译成class字节码后,在java目标类编译时织入,即先编译aspect类再编译目标类

Spring AOP原理分析

AOP实现之Spring AOP

实现原理分析

Spring AOP是通过动态代理技术实现的
而动态代理是基于反射设计的。(关于反射的知识,请自行学习)
动态代理技术的实现方式有两种:基于接口的JDK动态代理和基于继承的CGLib动态代理。

Spring AOP原理分析

  • JDK动态代理:

    目标对象必须实现接口
    Spring AOP原理分析

  • CGLib动态代理

    目标对象不需要实现接口
    底层是通过继承目标对象产生代理子对象(代理子对象中继承了目标对象的方法,并可以对该方法进行增强)
    Spring AOP原理分析

使用(了解)

其使用ProxyFactoryBean创建:
使用< aop:advisor >定义通知器的方式实现AOP则需要通知类实现Advice接口
增强(通知)的类型有:
* 前置通知:org.springframework.aop.MethodBeforeAdvice
* 后置通知:org.springframework.aop.AfterReturningAdvice
* 环绕通知:org.aopalliance.intercept.MethodInterceptor
* 异常通知:org.springframework.aop.ThrowsAdvice