原创

Spring Aop 详解

file

1. 什么是AOP

AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性

2. 基本概念

2.1 术语

  • Aspect(切面):通常是一个类,里面可以定义切入点和通知
  • JointPoint(连接点):程序执行过程中明确的点,一般是方法的调用
  • Advice(通知):AOP在特定的切入点上执行的增强处理,有before,after,afterReturning,afterThrowing,around
  • Pointcut(切入点):就是带有通知的连接点,在程序中主要体现为书写切入点表达式
  • weave(织入):将切面应用到目标对象并导致代理对象创建的过程
  • introduction(引入):在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段
  • AOP代理:AOP框架创建的对象,代理就是目标对象的加强。Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类
  • 目标对象(Target Object): 包含连接点的对象。也被称作被通知或被代理对象。

2.2 通知类型(Advice)

  • 前置通知:在我们执行目标方法之前运行(@Before)
  • 后置通知:在我们目标方法运行结束之后 ,不管有没有异常(@After)
  • 返回通知:在我们的目标方法正常返回值后运行(@AfterReturning)
  • 异常通知:在我们的目标方法出现异常后运行(@AfterThrowing)
  • 环绕通知:动态代理, 需要手动执行joinPoint.procced()(其实就是执行我们的目标方法执行之前相当于前置通知, 执行之后就相当于我们后置通知(@Around)

3. Spring Aop原理

  • Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,JDK动态代理基于接口cglib基于子类
  • Spring AOP 属于运行时增强,而 AspectJ 是编译时增强。 Spring AOP 基于代理(Proxying),而 AspectJ 基于字节码操作(Bytecode Manipulation)。

Spring AOP就是基于动态代理的,如果要代理的对象,实现了某个接口,那么Spring AOP会使用JDK Proxy,去创建代理对象,而对于没有实现接口的对象,就无法使用 JDK Proxy 去进行代理了,这时候未实现接口的类代理Spring AOP会使用Cglib ,这时候Spring AOP会使用 Cglib 生成一个被代理对象的子类来作为代理,如下图所示:
file

当然你也可以使用 AspectJ ,Spring AOP 已经集成了AspectJ ,AspectJ 应该算的上是 Java 生态系统中最完整的 AOP 框架了。

使用 AOP 之后我们可以把一些通用功能抽象出来,在需要用到的地方直接使用即可,这样大大简化了代码量。我们需要增加新功能时也方便,这样也提高了系统扩展性。日志功能、事务管理等等场景都用到了 AOP 。

正文到此结束
本文目录