《Spring实战4》第4章 面向切面的Spring

第1部分 Spring的核心

第4章 面向切面的Spring

  • 面向切面编程的基本原理
  • 通过POJO创建切面
  • 使用@AspectJ注解
  • 为AspectJ切面注入依赖

4.1 什么是面向切面编程

切面能帮助我们模块化横切关注点。简而言之,横切关注点可以被描述为影响应用多处的功能。
2个好处:

  • 现在每个关注点都集中于一个地方,而不是分散到多处代码中;
  • 服务模块更简洁。

4.1.1 定义AOP术语

在这里插入图片描述

  • 通知( Advice)
    在AOP术语中,切面的工作被称为通知。通知定义了切面是什么以及何时使用。
    5种类型的通知:

    1. 前置通知(Before):在目标方法被调用之前调用通知功能;
    2. 后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么;
    3. 返回通知(After-returning):在目标方法成功执行之后调用通知;
    4. 异常通知(After-throwing):在目标方法抛出异常后调用通知;
    5. 环绕通知(Around):通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。
  • 连接点(Join point)
    连接点是在应用执行过程中能够插入切面的一个点。

  • 切 点 ( Poincut)
    通知定义了切面的“什么”和“何时”的话,那么切点就定义了“何处”。切点的定义会匹配通知所要织入的一个或多个连接点。

  • 切面(Aspect)
    切面是 通知切点 的结合。

  • 引入(Introduction)
    引入允许我们向现有的类添加新方法或属性。

  • 织入(Weaving)
    织入是把切面应用到目标对象并创建新的代理对象的过程。
    在目标对象的生命周期里有多个点可以进行织入:

    1. 编译期:切面在目标类编译时被织入。这种方式需要特殊的编译器。AspectJ的织入编译器就是以这种方式织入切面的。
    2. 类加载期:切面在目标类加载到JVM时被织入。这种方式需要特殊的类加载器(ClassLoader),它可以在目标类被引入应用之前增 强该目标类的字节码。AspectJ 5的加载时织入(load-time weaving,LTW)就支持以这种方式织入切面。
    3. 运行期:切面在应用运行的某个时刻被织入。一般情况下,在织入切面时,AOP容器会为目标对象动态地创建一个代理对象。Spring AOP就是以这种方式织入切面的。

4.1.2 Spring对AOP的支持

Spring提供了4种类型的AOP支持:

  1. 基于代理的经典Spring AOP;
  2. 纯POJO切面;
  3. @AspectJ注解驱动的切面;
  4. 注入式AspectJ切面(适用于Spring各版本)。

前三种都是Spring AOP实现的变体,Spring AOP构建在 动态代理 基础之上,因此,Spring对AOP的支持局限于 方法拦截

  • Spring通 知 是 Java编 写 的

  • Spring在运行时通知对象
    在这里插入图片描述

  • Spring只支持方法级别的连接点

4.2 通过切点来选择连接点

在这里插入图片描述

4.2.1 编写切点

在这里插入图片描述
在这里插入图片描述

4.2.2 在切点中选择bean

在这里插入图片描述

4.3 使用注解创建切面

使用注解来创建切面是AspectJ 5所引入的关键特性。

4.3.1 定义切面

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4.3.2 创建环绕通知

在这里插入图片描述

4.3.3 处理通知中的参数

在这里插入图片描述

在这里插入图片描述

4.3.4 通过注解引入新功能

在这里插入图片描述
在这里插入图片描述
@DeclareParents注解由三部分组成:

  • value属性指定了哪种类型的bean要引入该接口。在本例中,也就是所有实现Performance的类型。(标记符后面的加号表示 是Performance的所有子类型,而不是Performance本身。)
  • defaultImpl属性指定了为引入功能提供实现的类。在这里,我们指定的是DefaultEncoreable提供实现。
  • @DeclareParents注解所标注的静态属性指明了要引入了接口。在这里,我们所引入的是Encoreable接口。

4.4 在XML中声明切面

在这里插入图片描述

4.5 注入AspectJ切面

在这里插入图片描述
在这里插入图片描述

4.6 小结

AOP是面向对象编程的一个强大补充。通过AOP,我们现在可以把之前分散在应用各处的行为放入可重用的模块中。
Spring提供了一个AOP框架,让我们把切面插入到方法执行的周围。
通过使用@AspectJ注解和简化的配置命名空间,在Spring中装配通知和切点变得 非常简单。
当Spring AOP不能满足需求时,我们必须转向更为强大的AspectJ。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值