1、spring aop总览.md 3.3 KB

环境信息

Maven 依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>5.2.2.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.6</version>
</dependency>

思维导图

img

Spring AOP 总览

AOP 引入

Java OOP 存在哪些局限性?

  • 静态化语言:类结构一旦定义,不容易被修改
  • 侵入性扩展:通过继承和组合组织新的类结构

AOP 常见使用场景

  • 日志场景
  • 诊断上下文,如:Log4j 或 Logback 中的 _x0008_MDC
  • 辅助信息,如:方法执行时间
  • 统计场景
    • 方法调用次数
    • 执行异常次数
    • 数据抽样
    • 数值累加
  • 统计场景
    • 方法调用次数
    • 执行异常次数
    • 数据抽样
    • 数值累加
  • 性能场景
    • 缓存,如 Spring Cache
    • 超时控制

Java AOP 设计模式

  • 代理模式:静态和动态代理
  • 判断模式:类、方法、注解、参数、异常...
  • 拦截模式:前置、后置、返回、异常

Java AOP 代理模式(Proxy)

  • Java 静态代理
    • 常用 OOP 继承和组合相结合
  • Java 动态代理
    • JDK 动态代理
    • 字节码提升,如 CGLIB

Java AOP 判断模式(Predicate)

判断来源

  • 类型(Class)
  • 方法(Method)
  • 注解(Annotation)
  • 参数(Parameter)
  • 异常(Exception)

Java AOP 拦截器模式(Interceptor)

拦截类型:

  • 前置拦截(Before)
  • 后置拦截(After)
  • 异常拦截(Exception)

Spring AOP 功能概述

核心特性:

  • 纯 Java 实现、无编译时特殊处理、不修改和控制 ClassLoader
  • 仅支持方法级别的 Join Points
  • 非完整 AOP 实现框架
  • Spring IoC 容器整合
  • AspectJ 注解驱动整合(非竞争关系)

Spring AOP 编程模型

注解驱动

  • 实现:Enable 模块驱动,@EnableAspectJAutoProxy
  • 注解:
    • 激活 AspectJ 自动代理:@EnableAspectJAutoProxy
    • Aspect : @Aspect
    • Pointcut :@Pointcut
    • Advice :@Before@AfterReturning@AfterThrowing@After@Around
    • Introduction :@DeclareParents

XML 配置驱动

  • 实现:Spring Extendable XML Authoring
  • XML 元素
    • 激活 AspectJ 自动代理:<aop:aspectj-autoproxy/>
    • 配置:<aop:config/>
    • Aspect : <aop:aspect/>
    • Pointcut :<aop:pointcut/>
    • Advice :<aop:around/><aop:before/><aop:after-returning/><aop:after-throwing/><aop:after/>
    • Introduction :<aop:declare-parents/>
    • 代理 Scope : <aop:scoped-proxy/>

底层 API

  • 实现:JDK 动态代理、CGLIB 以及 AspectJ
  • API:
    • 代理:AopProxy
    • 配置:ProxyConfig
    • Join Point:Joinpoint
    • Pointcut :Pointcut
    • Advice :AdviceBeforeAdviceAfterAdviceAfterReturningAdviceThrowsAdvice

Spring AOP Advice 类型

Advice 类型:

  • 环绕(Around)
  • 前置(Before)
  • 后置(After)
    • 方法执行
    • finally 执行
  • 异常(Exception)

Spring AOP 代理实现

  • JDK 动态代理实现 - 基于接口代理
  • CGLIB 动态代理实现 - 基于类代理(字节码提升)
  • AspectJ 适配实现