AOP的概念

动态代理:

特点:字节码随用随创建,随用随加载
作用:不修改源码的基础上对方法增强
分类:
基于接口的动态代理
基于子类的动态代理

基于接口的动态代理:

涉及的类:Proxy
提供者:JDK官方
如何创建代理对象:
使用Proxy类中的newProxyInstance方法
创建代理对象的要求:
被代理类最少实现一个接口,如果没有则不能使用
newProxyInstance方法的参数:
ClassLoader:类加载器
它是用于加载代理对象字节码的,和被代理对象使用相同的类加载器。
Class[]:字节码数组
它是用于让代理对象和被代理对象有相同方法
InvocationHandler:用于提供增强的代码
它是让我们写如何代理。我们一般都是写一个该接口的实现类,通常情况下都是匿名内部类,但不是必须的。

基于子类的动态代理:

涉及的类:Enhancer
提供者:第三方cglib库
如何创建代理对象:
使用Enhancer类中的create方法
创建代理对象的要求:
被代理类不能是最终类
create方法的参数:
Class:字节码
它是用于指定被代理对象的字节码
Callback:用于提供增强的代码
它是让我们写如何代理。我们一般都是写一个该接口的实现类,通常情况下都是匿名内部类,但不是必须的。
我们一般写的都是该接口的子接口实现类:MethodInterceptor

什么是AOP

AOP:全称是Aspect Oriented Programming 即:面向切面编程

AOP的作用和优势

作用:在程序运行期间,不修改源码对已有方法进行增强
优势:减少重复代码、提高开发效率、维护方便

AOP的实现方式

使用动态代理技术

spring中的AOP相关术语

  • Joinpoint(连接点):
    • 所谓连接点是指那些被拦截到的点,在spring中,这些点指的是方法,因为spring只支持方法类型的连接点。
  • Pointcut(切入点):
    • 所谓切入点是指我们要对哪些Joinpoint进行拦截的定义。
  • Advice(通知/增强):
    • 所谓通知是指拦截到Joinpoint之后所要做的事情就是通知
    • 通知的类型:前置通知,后置通知,异常通知,最终通知,环绕通知
  • Introduction(引介):
    • 引介是一种特殊的通知在不修改类代码的前提下,Introduction可以在运行期为类动态地添加一些方法或Field。
  • Target(目标对象):
    • 代理的目标对象
  • Weaving(织入):
    • 是指把增强应用到目标对象来创建的代理对象的过程。
    • spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入。
  • Proxy(代理):
    • 一个类被AOP织入增强后,就产生一个结果代理类
  • Aspect(切面):
    • 是切入点的通知(引介)的结合。

      spring中基于XML和注解的AOP配置

      image.png