spring aop

spring aop

起男 670 2020-07-08

spring aop

  • aop面向切面编程,可以说是oop面向对象编程的补充和完善
  • oop引入继承、封装、多态等概念来建立一种对象层次结构,用以模拟公共行为的一个集合
  • 但当我们要为分散的对象引入公共行为的时候,oop则无能为力,oop适合定义从上到下的关系,但并不适合定义从左到右的关系

基本概念

  • aspect(切面):把通知和切入点进行关联的过程
  • pointcut(切点/切入点):将通知和连接点进行关联
  • advice(通知/增强):在特定的切入点上执行的增强操作
  • joinPoint(连接点):程序执行过程中需要增强的点
  • target(目标对象):通知织入的目标类
  • Introduction(引介):引介是一种特殊的增强,它会为类添加一些属性和方法
  • proxy(代理):当一个类被织入后就会产生一个代理类
  • weaving(织入):将通知加入目标类的一个过程

织入

  • 编译期织入:需要使用特殊的java编译器
  • 类装载期织入:需要使用特殊的类加载器
  • 动态代理织入:在运行期间为目标类生成代理

spring采用动态代理织入,aspectJ采用编译器和类装载

通知

  • 前置通知(@Before):在执行连接点之前执行
  • 后置通知(@After):在执行连接点之后执行,不管有没有异常
  • 返回通知(@AfterReturning):在连接点正常返回之后执行
  • 异常通知(@AfterThrowing):在连接点出现异常后执行
  • 环绕通知(@Around):在连接点之前和之后执行,需要执行joinPoint.procced()

切入点

@Pointcut:声明一个切入点(切入点方法签名返回值必须是void)

切入点表达式

指示符作用
execution匹配方法
within匹配指定类及其子类
this匹配可向上转型为指定类信息的代理类(不支持通配符)
target匹配可向上转型为指定类信息的目标类
args匹配运行时传入的参数列表
@within匹配只有指定注解的类
@target匹配持有指定注解的目标对象
@args匹配参数列表中具有特点注解
@annotation匹配持有特定注解

类型匹配语法

  • *:匹配任何字符串
  • ..:匹配任何数量字符串的重复
  • +:匹配指定类型的子类型

aspectJ使用 &&(且)、||(或)、!(非)来组合表达式

由于在xml中使用不方便,springaop提供了and、or、not来代替

execution

execution(<修饰符模式>?<返回值模式><方法名模式>(<参数模式>)<异常模式>?)

  • 修饰符模式:用于匹配访问修饰符,可选
  • 返回值模式:用于匹配返回值类型
  • 方法名模式:匹配包,类,方法名
  • 参数模式:匹配方法中的参数,..代表所有
  • 异常模式:匹配抛出的异常,可选

代理模式

静态代理

由程序员创建或工具生成代理类的源码,再编译代理类

所谓的静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了

动态代理

利用反射在程序运行期间生成代理对象

JDK动态代理

原理

利用javaJDK的Proxy类,通过接口生产目标代理对象

缺点

jdk动态代理,必须是面向接口,目标类必须实现接口

CGLIB动态代理

原理

生成目标类的子类,这个子类就是被增强过的代理对象

缺点

由于需要生成子类,所以该类或方法不要声明成final的

spring选择

  • 如果目标对象实现了接口,默认情况下会采用jdk动态代理实现
  • 如果目标对象实现了接口,可以强制使用cglib实现aop
  • 如果目标对象没有实现接口,必须采用cglib

string会自动在jdk动态代理和cglib之间切换