AOP 常见使用场景

  • 日志场景
    • 诊断上下文,如log4j 或 logback 或 MDC (线程安全Map,临时储存一些信息)
    • 辅助信息,如方法执行时间
  • 统计场景
    • 方法调用次数
    • 执行异常次数
    • 数据抽样
    • 数值累加
  • 安防场景
    • 熔断:如:Netflix Hystrix
    • 限流和降级:如:Alobaba Sentinel
    • 认证和授权,如:spring security
    • 监控,如:JMX
  • 性能场景

    • 缓存,如Spring Cache
    • 超时控制

      AOP概念

      AOP 定义

  • AspectJ:Aop是一种编程方式,拦截OOP的参数和字段等

  • Spring AOP:辅助完善AOP的编程模式。SpringAOP 没有编译时的一个特殊处理 ,运行时进行处理。大部分是通过反射、ASM实现。
    • Spring AOP 的三种实现方式:JDK 动态代理、Cglib字节码提升、AspectJ实现
  • 他们都是通过类的方式实现,底层通过class字节码做修改。

    AOP 相关组件

  • Aspect:切面;Aspect 申明类似于Java中的类声明

    一个 Aspact 对应多个 Join point ,一个 Join point 对应多个 Action (Advice), 一个 Advice 可以对应多种拦截的实现动作

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

  • pointcut:切点;表示一组 join point ,这些 join point 或通过逻辑关系组合起来,或是通过逻辑匹配、正则表法式的方式集中起来,它定义了相应的advice将要发生的地方。
  • Advice:增强;advice 定义了 pointcut 里面定义的程序点具体要做的操作;它通过 before 、after 和 around 来区别是在每个 join point之前还是之后还是代替执行的代码;
    • before advice, 在 join point 前被执行的 advice. 虽然 before advice 是在 join point 前被执行, 但是它并不能够阻止 join point 的执行, 除非发生了异常(即我们在 before advice 代码中, 不能人为地决定是否继续执行 join point 中的代码)
    • after return advice, 在一个 join point 正常返回后执行的 advice
    • after throwing advice, 当一个 join point 抛出异常后执行的 advice
    • after(final) advice, 无论一个 join point 是正常退出还是发生了异常, 都会被执行的 advice.
    • around advice, 在 join point 前和 joint point 退出后都执行的 advice. 这个是最常用的 advice.
  • introduction:introduction可以为原有的对象增加新的属性和方法。
  • Target:目标对象;织入 Advice 的目标对象.。
  • Weaving:织入;将 Aspect 和其他对象连接起来, 并创建 Adviced object 的过程

    AOP 概念图整合

    Spring AOP 总览 (一) - 图1