【源码】Spring AOP 1 基础概念
前言
用过 Spring,就一定用过 Spring AOP。本着知其所以然的态度,对 Spring AOP 的源码进行解读。从整个类的抽象,对部分源码的深入,结合 类图、序列图 的分析,旨在了解 Spring AOP 的真正原理,在使用切面编程的时候更加得心应手、事半功倍。万丈高楼平地起,先温习一下相关基础概念。
基础概念
AOP
Aspect-oriented Programming(面向切面编程),允许我们动态地、非入侵地修改类地行为
Aspect
切面,Aspect 之于 AOP 好比 Class 于 OOP (面向对象编程)。“切入”我们指定的方法执行相应的逻辑(注意此处的切入并非代码的入侵),比如 Spring 事务的实现。在 Spring AOP 中 Aspect 通常是一个普通的类,由 XML 或者注解声明为一个切面。
Join point
官方定义,程序在运行期间的一个“点”,比如方法的执行、异常的处理。个人理解,如果把 AOP 理解成谁在哪里干了什么?那么 Join point 就是这个地点的抽象。
Advice
通知,在 Join point 的逻辑处理。比如在方法前(before)、后(after)进行切入。通常,在 AOP 框架中,通知会被维护成 Join point 的一串拦截链(interceptors chain)
Pointcut
通常称为切点,对 Join point 的匹配描述,比如 execution 表达式。 Pointcut 告诉 Aspect,Advice 应该去对应的 Join point 执行。在 Spring AOP 中,我们对 Pointcut 的解析沿用了 AspectJ 的规范。
通知类型
此处开始我们站在 Spring AOP 的角度,所有 Join point 将被认为是一个“方法”
Before advice
在方法之前执行的通知,它不能打断方法的执行,除非执行过程中抛出了异常。
After returning advice
在方法成功执行完成后(没有抛出异常)执行的通知
After throwing advice
方法抛出异常后执行的通知
After (finally) advice
无论方法是否正常结束,都将被执行的通知(可以理解为在 finally 块里执行的通知)
Around advice
最强大的通知,它不仅可以在方法的前后执行通知,还可以打断方法的执行,或者返回一些自定义的结果,甚至抛出异常。
总结
基本的概念已经了解。想要“强壮”、“优雅”的完成这样一个功能,抽象的功夫必然要做好。Spring 整个框架就是“抽象”的教科书,接下来我们会划分较多的章节,来一个个解析 aopalliance(AOP联盟)和Spring 对整个 AOP 的抽象,并对中间必要的细节结合源码进行解读。最后梳理 Spring AOP 是如何实现的,以至于到了我们用户层,仅仅需要注解式的( XML 等方式)声明,就能优雅的使用~