前言
本文是「如何实现一个简易版的 Spring
系列」的第五篇,在之前介绍了 Spring
中的核心技术之一 IoC
,从这篇开始我们再来看看 Spring
的另一个重要的技术——AOP。用过 Spring
框架进行开发的朋友们相信或多或少应该接触过 AOP
,用中文描述就是面向切面编程。学习一个新技术了解其产生的背景是至关重要的,在刚开始接触 AOP
时不知道你有没有想过这个问题,既然在面向对象的语言中已经有了 OOP 了,为什么还需要 AOP
呢?换个问法也就是说在 OOP
中有哪些场景其实处理得并不优雅,需要重新寻找一种新的技术去解决处理?(P.S. 这里建议暂停十秒钟,自己先想一想…)
为什么需要 AOP
我们做软件开发的最终目的是为了解决公司的各种需求,为业务赋能,注意,这里的需求包含了业务需求
和系统需求
,对于绝大部分的业务需求的普通关注点,都可以通过面向对象(OOP
)的方式对其进行很好的抽象、封装以及模块化,但是对于系统需求使用面向对象的方式虽然很好的对其进行分解并对其模块化,但是却不能很好的避免这些类似的系统需求在系统的各个模块中到处散落的问题。
因此,需要去重新寻找一种更好的办法,可以在基于 OOP
的基础上提供一套全新的方法来处理上面的问题,或者说是对 OOP
面向对象的开发模式做一个补充,使其可以更优雅的处理上面的问题,迄今为止 Spring
提供一个的解决方案就是面向切面编程——AOP
。有了 AOP
后,我们可以将这些事务管理
、系统日志
以及安全检查
等系统需求(横切关注点:cross-cutting concern
)进行模块化的组织,使得整个系统更加的模块化方便后续的管理和维护。细心的你应该发现在 AOP
里面引入了一个关键的抽象就是切面(Aspect
),用于对于系统中的一些横切关注点进行封装,要明确的一点是 AOP
和 OOP
不是非此即彼的对立关系,AOP
是对 OOP
的一种补充和完善,可以相互协作来完成需求,Aspect
对于 AOP
的重要程度就像 Class
对 OOP
一样。
几个重要的概念
我们最终的目的是要模仿 Spring
框架自己去实现一个简易版的 AOP
出来,虽然是简易版但是会涉及到 Spring AOP
中的核心思想和主要实现步骤,不过在此之前先来看看 AOP
中的重要概念,同时也是为以后的实现打下理论基础,这里需要说明一点是我不会使用中文翻译去描述这些 AOP
定义的术语(另外,业界 AOP
术语本来就不太统一),你需要重点理解