1 概述
在软件开发领域,基于面向对象编程(OOP)的思想和实践,应用程序被划分为多个类和模块。通过引入接口来实现松散耦合的设计,而封装和继承使得我们可以隐藏对象数据并扩展功能。但反过来讲,随着系统的演进,OOP的这些特点也增加了系统的复杂性,为了解决这个问题,我们开始遵循将应用程序划分为不同逻辑层和模块的设计原则,常见的如Web服务层、业务服务层和数据访问层。
但是,即使将功能划分为不同的层,所有层中也可能需要某些通用的功能,例如安全性、日志记录、缓存和性能监视。这些功能被称为横切关注点。在OOP中,这些横切关注点的代码与业务逻辑处理代码往往是混合在一起的。例如,事务处理和安全控制代码与业务逻辑代码混合在一起,这样的实现奖励了代码的可重用型性,增加了维护成本,并且违反单一责任原则。
那么,如何有效实现这些横切关注点?这就需要引入面向切面编程的设计理念。本篇将导论Spring容器中AOP的概念以及实现这些概念的方法和实践。
2 面向切面与Spring AOP
在引入Spring AOP之前,先来解释什么是切面。所谓切面,本质上解决的是关注点分离的问题。而面向切面编程可以说是面向对象编程的一种补充,目标是将一个应用程序抽象成各个切面。针对下图所示的应用场景中,可以引入AOP的思想把书屋处理和安全控制等非功能性需求从业务逻辑中拆分出来,构成独立的关注点。
从上图中可以看出,所谓切面相当于对象间的横切点,可以将其抽象为单独的模块进行开发和维护。
3 Spring AOP核心概念
AOP只是一种设计理念,虽然概念不复杂,但实现过程不那么简单。而Spring作为AOP的一款具体实现框架,也提供了自身的一些设计思想和编程组件。
为了理解AOP的具体实现过程,首先需要引入一组特定的术语,包括连接点(JoinPoint)、通知(Advice)、切点(PointCut)以及切面(Aspect)。
在AOP中,连接点表示应用执行过程中能够插入切面的一个点。这种连接点可以是方法调用、异常处理、类初始化或对象实例化。
通知,描述的是切面何时执行以及如何执行对应的业务逻辑。通知有很多种类型,比如在方法执行之前、之后、前后和执行完成时进行通知,或者在方法执行异常时进行通知。
请注意,通知不一定应用于所有连接点,所以引入了切点的概念。切点是连接点的集合,用于定义必须执行的通知。因此切点为组件在应用程序中执行具体的通知提供了细粒度控制的方法。
最后,通知和切点组合在一起就构成了切面。切面用于定义应用程序中的业务逻辑及其执行的位置。