AOP--面向切面编程

AOP(面向切面编程)相关概念详解

面向切面编程 (Aspect-Oriented Programming)

AOP中的一些相关概念

  1. Aspect(切面)

    Aspect声明类似于Java中的类声明,在Aspect中会包含一些Pointcut(切入点),以及相应的Advice(通知.,增强)

    Aspect由两部分组成

    • Pointcut–切入点
    • Advice–通知,增强
  2. Join point(连接点)

    表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,他自身还可以嵌套其他的joint point,

    特点:

    1. 执行时机: 它标识了可以插入切面逻辑的确切时机
    2. 多样性: 不同的AOP框架可能会支持不同类型的连接点,常见的连接点包括:
      • 方法调用(Method Call)
      • 方法执行(Method Execution)
      • 构造函数执行(Constructor Execution)
      • 属性访问(Field Access)
    3. 与切点的关系:切点是一个表达式,用于定义哪些连接点会被通知拦截,切点可以包括多个连接点,用于精确指定在哪些连接点上应用切面逻辑
  3. Pointcut(切点)

    它定义了在程序执行过程中,可以应用通知的连接点的集合

    // 在Aspect(切面)的实现类中
    @Pointcut("execution(* com.example.service.UserService.*(..))")
    public void userServiceMethods() {}
    // 该示例中,定义了一个切点userServiceMethods,用于匹配UserService类中的所有方法
    
    // 在Aspect(切面)的实现类中
    @Before("userServiceMethods()")
    public void logBefore(JoinPoint joinPoint) {
        System.out.println("Executing: " + joinPoint.getSignature().getName());
    }
    // 该方法是声明了一个前置通知logBefore
    // 作用是 为切点userServiceMethods的规则所匹配的方法执行前执行该通知
    

    通过切点,能够以声明的方式指定横切关注点,从而提高代码的模块化和可维护性。

  4. Advice(增强,通知)

    通知定义了在连接点(Join Point)处要执行的操作,通常用于实现横切关注点,比如日志记录、事务管理、安全检查等。

    通知的主要类型有:

    1. 前置通知(Before Advice)
      • 目标方法执行之前执行
      • 用于记录日志,检查权限
    2. 后置通知(After Advice)
      • 目标方法执行之后执行,不管是正常返回还是抛出异常,都会调用
      • 记录方法的执行时间和结果,清理资源
    3. 环绕通知(Around Advice)
      • 包含方法执行前后的逻辑,可以控制方法是否执行。
      • 这是最强大的通知类型,能够在调用方法之前和之后添加自定义逻辑。
    4. 异常通知(After Throwing Advice)
      • 在方法抛出异常时执行
      • 用于记录异常信息和执行补救措施
    5. 返回通知(After Returning Advice)
      • 方法成功执行并返回结果后执行
      • 处理返回值,记录成功信息
    6. 最终通知(Final Advice)
      • 目标方法执行完成后执行,不管目标方法是成功执行还是抛出异常都会执行
      • 资源释放,清理操作,确保方法在执行后执行一些必要的逻辑

    后置通知和最终通知的区别

    1. 执行时机

      都是在目标方法执行结束后执行,但是最终通知的主要目的是确保在任何情况下都能执行特定逻辑,最终通知通常在环绕通知中以finally代码块形式实现,以确保他总是被调用

    2. 处理异常

      • 后置通知: 在目标方法正常返回后执行,要是目标方法抛出异常,后置通知依然会调用,但是无法捕获和处理异常,适合用于记录操作结果和状态
      • 最终通知: 设计为无论目标方法的执行结果如何,都能执行特定逻辑,可以在finall代码块捕获异常和执行必要的后续操作
    3. 适合场景

      • 后置通知:
        • 更适合用于记录监控或其他不需要强制执行的操作。
        • 例如,记录方法的执行时间或结果。
      • 最终通知:
        • 更适合用于确保资源的释放清理操作等需要在所有情况下执行的逻辑。
        • 例如,关闭数据库连接或释放文件句柄。
  5. Target(目标对象)

    指的是被代理的对象,通常是一个具体的类或实例,它包含了实际的业务逻辑。AOP 的主要目的是在不修改目标对象的情况下,增强其功能或行为。

    1. 目标代理

      • AOP 通常会创建一个代理对象,这个代理对象会在调用目标对象的方法时,插入切面逻辑(如前置通知、后置通知、异常通知等)。
      • 代理可以是动态生成的(如通过 Java 的反射机制)或静态的(如在编译时生成)。
    2. 功能增强

      • 通过 AOP,目标对象的功能可以被增强,比如添加日志记录、性能监控、事务处理等。

      • 这些增强逻辑是通过切面(Aspect)实现的,切面定义了何时、何地以及如何增强目标对象的行为。

  6. Weaving(织入)

    织入(Weaving)是指将切面(Aspect)与目标对象(Target Object)结合的过程,以实现增强功能的过程。织入可以发生在不同的阶段,主要有编译时织入,类加载时织入和运行时织入(Spring AOP的主要实现方式)

    织入的过程

    1. 定义切面–创建包含切点和通知的切面
    2. 选择连接点–声明切点(execution语句)
    3. 生成代理–Spring在运行时生成目标对象(Target Object)的代理对象
    4. 执行增强–调用切点规则匹配到的的方法时,执行通知逻辑
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值