Spring -> AOP

Spring AOP

    • 1. AOP基本概念
          • 1.1 切面
          • 1.2 关注点
          • 1.3 核心思想
          • 1.4 AOP的实现技术
          • 1.5 模式
    • 2. AOP应用场景
    • 3. AOP术语
          • 3.1 通知 Advice
          • 3.2 切点 Pointcut
          • 3.3 连接点 Join Point
          • 3.4 切面 Aspect
          • 3.5 织入 Weaving
          • 3.6 引入 Introduction
          • 3.7 目标对象 Target Object / 被通知的对象 Advised
    • 4.Spring对AOP的支持
          • 4.1 支持方式
          • 4.2 特点
          • 4.3 使用注解创建切面
            • 4.3.1 切点表达式
            • 4.3.2 切面注解
          • 4.4 XML中声明切面
    • 5. AOP开发步骤

1. AOP基本概念

AOP(Aspect Oriented Programing),即"面向方面编程",通常我们称之为"面向切面编程"。

  • OOP适用于横切,当为分散的对象引入公共行为的时候,就需要AOP。
1.1 切面
  • 与业务无关,把业务模块所共同调用的逻辑或责任封装起来。
    • 配送外卖
      • 业务:装订外卖,进行配送
      • 逻辑 / 责任:外卖物品的核对(品种、数量)、配送地址的核对(地址有效性、配送范围)… …
    • 切蛋糕
      • AOP相当于刀,负责将蛋糕切开 -> 只需要知道往哪儿切,获取其内部的信息。但切开后怎么处理蛋糕,不需要关心。
  • 减少系统的重复代码,降低模块间的耦合度,有利于未来的可操作性、可扩展性和可维护性
1.2 关注点
  • AOP把软件系统分为两个部分
    • 核心关注点 -> 业务处理
    • 横切关注点 -> 发生在核心关注点的多处,且各处基本相似。(权限认证、日志、事务处理)
1.3 核心思想
  • 将应用程序中的商业逻辑同对其提供支持的通用服务进行分离
1.4 AOP的实现技术
  1. 动态代理
    利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行
  2. 静态织入
    引入特定的语法创建“切面”,从而使得编译器可以在编译期间织入有关“切面”的代码
1.5 模式
  1. 装饰器模式
    动态地给一个对象添加一些额外的职责
  2. 代理模式
    为其它对象提供一种代理以控制对这个对象的访问

2. AOP应用场景

  • Authentication 权限
  • Caching 缓存
  • Error handling 错误处理
  • Lazy loading 懒加载
  • Debugging 调试
  • Synchronization 同步
  • Transactions 事务

3. AOP术语

3.1 通知 Advice
  • 切面的工作(切面是什么,何时使用)
  • 通知类型
    • 前置通知(Before): 在目标方法被调用之前调用通知功能
    • 后置通知(After): 在目标方法完成之后调用通知(不关心方法的输出是什么)
    • 返回通知(After-returning):在目标方法成功执行之后调用通知
    • 异常通知(After-throwing): 在目标方法抛出异常后调用通知
    • 环绕通知(Around):通知包裹了被通知的方法,在被通知的方法通知之前和调用之后执行自定义的行为。
3.2 切点 Pointcut
  • 缩小切面所通知的连接点的范围(切面何处使用)
  • 切点的定义会匹配通知所要织入的一个或者多个连接点。通常使用明确的类和方法名称,或者利用正则表达式定义所匹配的类和方法名来指定这些切点。
3.3 连接点 Join Point
  • 在应用执行过程中能够插入切面的一个点(方法调用、抛出异常、修改字段)
  • 切面代码可以利用这些点插入到应用的正常流程之中,并添加新的行为。 面向对象的操作
3.4 切面 Aspect
  • 通知+切点
3.5 织入 Weaving
  • 将切面应用到目标对象并创建新的代理对象的过程
  • 可在哪些连接点织入:
    • 编译期
      • 在目标类编译时织入
      • 需要特殊的编译器
    • 类加载器
      • 在目标类加载到JVM时被织入
      • 需要特殊的类加载器
    • 运行期
      • 在应用运行的某一时刻被织入
      • 在织入切面时,IoC容器会为目标对象动态创建一个代理对象。
3.6 引入 Introduction
  • 向现有的类添加新方法和属性
3.7 目标对象 Target Object / 被通知的对象 Advised
  • 被一个或者多个切面所通知(Advice)的对象。
  • SpringAOP是通过运行时代理实现的,这个对象永远是一个被代理(Proxied)对象

4.Spring对AOP的支持

4.1 支持方式
  • 基于代理的经典 AOP 支持
  • 纯 POJO 切面
  • @AspectJ 注解驱动切面
  • 注入式 AspectJ 切面
4.2 特点
  • Spring通知使用Java编写
  • Spring在运行时通知对象
  • Spring只支持方法级别的连接点
4.3 使用注解创建切面
4.3.1 切点表达式
  • arg() : 限制连接点匹配参数为指定类型的执行方法
  • @args(): 限制连接点匹配参数由指定注解标注的执行方法
  • execution(): 用于匹配时连接点的执行方法
4.3.2 切面注解
  • @After : 通知方法会在目标方法返回或者抛出异常后调用
  • @AfterReturning : 通知方法会在目标方法返回后调用
  • @AfterThrowing : 通知方法会在目标方法抛出异常后调用
  • @Around : 通知方法会将目标方法封装起来
  • @Before : 通知方法会在目标方法调用之前执行
4.4 XML中声明切面
  • aop:aspectj-autoproxy: 启用@AspectJ注解驱动的切面
  • aop:config: 顶层的AOP配置元素。大多数的aop:*元素必须包含在aop:config元素内
  • aop:pointcut: 定义一个切点
  • aop:aspect: 定义一个切面
  • aop:advisor: 定义AOP通知器
  • aop:after: 定义AOP后置通知
  • aop:after-returning: 定义AOP返回通知
  • aop:after-throwing: 定义AOP异常通知
  • aop:around: 定义AOP环绕通知
  • aop:before: 定义一个AOP前置通

5. AOP开发步骤

  1. 抽取横切:分析需求,提取出横切关注点
  2. 实现横切:独立实现横切关注点
  3. 切面组装:配置横切关注点与核心关注点的关系

你可能感兴趣的:(JavaEE)