Spring实战 | 第一部分 Spring的核心(第四章 面向切面的Spring)

本文深入探讨了Spring中的面向切面编程(AOP),介绍了AOP的基本原理、通知类型、切点、切面以及如何在Spring中声明和使用切面。通过例子详细阐述了如何使用@AspectJ注解创建切面,以及如何通过XML配置声明切面,包括前置、后置、环绕通知等,并讨论了如何通过切面引入新功能。最后,探讨了Spring对AspectJ切面的依赖注入。
摘要由CSDN通过智能技术生成

第四章 面向切面编程

面向切面编程的基本原理

通过POJO创建切面

使用@AspectJ注解

为AspectJ切面注入依赖

AspectJ是一个面向切面的框架,它扩展了java语言。AspectJ定义了AOP语法,它有一个专门的编译器用来生成遵循java字节编码规范的Class文件。

在第2章,我们介绍了如何使用依赖注入(DI)管理和配置我们的应用对象。DI有助于应用对象之间的解耦,而AOP可以实现横切关注点与它们所影响的对象之间的解耦。

日志是应用切面的常见范例,但它并不是切面适用的唯一场景。通过本书,我们还会看到切面锁适用的多个场景,包括声明式事务、安全和缓存。

本章展示了Spring对切面的支持,包括如何把普通类声明为一个切面和如何使用注解创建切面。除此之外,我们还会看到AspectJ,另一种流行的AOP实现,如何补充spring AOP框架的功能。但是,我们先不管事务、安全和缓存,先看一下spring是如何实现切面的,就从AOP的基础知识开始说起。

一、什么是面向切面编程

如前所述,切面能帮助我们模块化横切关注点。简而言之,横切关注点可以被,描述为影响应用多处的功能。例如,安全就是一个横切关注点,应用中的许多方法都会涉及到安全规则,如下图直观呈现了横切关注点的概念。

a0933fd957d306b8df21a22ad47fc97216d.jpg

图中展示了一个被划分为模块的典型应用。每个模块的核心功能都是为特定业务领域提供服务,如果在整个应用中都使用相同的基类,继承往往导致一个脆弱的对象提醒;而使用委托可能需要对委托对象进行复杂的调用。

切面提供了取代继承和委托的另一种可选方案,而且在很多场景下更清晰简洁。在使用面向切面编程时,我们仍然在一个地方定义通用功能。横切关注点可以被模块化为特殊的类,这些类被称为切面(aspect)。这样做有两个好处:首先,现在每个关注点都集中在一个地方,而不是分散到多处代码中;其次,服务模块功能简洁,因为它们只包含主要关注点(或核心功能)的代码,而次要关注点的代码被移到切面中。

1、定义AOP术语

AOP已经形成了自己的术语,描述切面的常用术语有通知(advice)、切点(pointcut)和连接点(join point)。下图展示了这些概念是如何关联在一起的。

b6daf0c1d8544ba7c58572d905767e2235c.jpg

通知(advice)

在AOP术语中,切面的工作被称为通知,①描述切面要完成工作,②何时执行这个工资。

Spring切面可以应用5种类型的通知:

  • 前置通知(Before):在目标方法被调用之前调用通知功能;
  • 后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么;
  • 返回通知(After-returning):在目标方法成功执行之后调用通知;
  • 异常通知(After-throwing):在目标方法抛出异常后调用通知;
  • 环绕通知(Around):通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。

连接点(join point)

应用中可能有数以千计的时机应用通知,这些时机被称为连接点。连接点是在应用执行过程中能够插入切面的一个点。这个点可以是在调用方法时、抛出异常时、甚至修改一个字段时。切面代码可以利用这些点插入到应用的正常流程之中,并添加新的行为。

切点(pointcut)

切点有助于缩小切面所通知的连接点的范围。

切点的定义会匹配通知所要织入的一个或多个连接点,我们通常使用明确的类和方法名称,或是利用正则表达式定义所匹配的类和方法名称来指定这些切点。有些AOP框架允许我们创建动态的切点,可以根据运行时的决策来决定是否应用通知。

切面(Aspect)

切面是通知和切点的集合。通知和切点共同定义了切面的全部内容,它是什么,在何时何处完成其功能。

引入(Introduction)

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

织入(Weaving)

织入是吧切面应用到目标对象并创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中,在目标对象的生命周期里有多个点可以进行织入:

  • 编译器:切面在目标类编译时被织入。这种方式需要特殊的编译器,AspectJ的织入编译器就是这种方式织入切面的。
  • 类加载期:切面在目标类加载到JVM时被织入。这种方式需要特殊的类加载器(ClassLoader),它可以在目标类被引入应用之前增强该目标类的字节码。AspectJ5的加载时织入(load-time weaving,LTW)就支持以这种方式织入切面。
  • 运行期:切面在应用运行的某个时刻被织入。一般情况下,在织入切面时,AOP容器会为目标对象动
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值