Spring AOP是Spring众多优秀特性中的一个,我一直对它的实现比较好奇,最近有些闲暇时间,就整理了一些有关Spring AOP实现的资料。在整理的过程当中,又稍做深刻的理解一些优秀的框架和工具,好比asm,CGLIB,AspectJ等,顿觉本身知识浅薄,固然也难以抑制分享的冲动,因而就决定作一个系列文章——Spring AOP实现原理。html
文章总共分为5部分:spring
AOP简介编程
Spring AOP源码解析eclipse
笔者认为重点是3和5,这两部分针对实现原理作了深刻的探讨,有必定基础的同窗建议直接阅读重点部分。ide
Wiki对AOP的定义,AOP是一种编程范式,目的是为了将跨领域的关注点分离出来以达到模块化。它能够向现存代码中增长行为逻辑而不用修改原有代码,它是经过指定切入点(pointcut)来实现的,例如向以set为开头的函数(function)中增长日志功能。它能够实现将一些不是核心的业务逻辑(如日志等)添加到程序中,而不会使核心代码混乱。AOP为面向方面的软件开发奠基了基础。模块化
从定义中,咱们提取几个关键字:函数
咱们以一个简图来讲明:
从图中能够看出,业务A和业务B中都有log业务,面向切面的编程思想就将这些log业务从主业务中剥离出来,单独造成一个切面(Aspect),而后在切面中进行处理(Advice).
咱们以AspectJ的接入点模型(join-point model)为例,说明一下AOP中的概念
接入点(Join Point):方法调用,构造器调用,初始化class,实例化对象,成员变量的读写,异常处理等均可以成为接入点
切点(PointCuts):表明了一些接入点(Join Point)的集合,好比:
execution(* set*(*))
复制代码
以方法接入点为示例,表达式表明了匹配以set为开头而且只有一个参数的方法
Advice:指的能够在接入点的前(before),中(around),后(after)执行的代码
切面(Aspect):切面像是一个抽象出来的类,它不只融合了以上的元素,它也能够包含本身的属性,方法等,固然,切面也能够被实例化。在Spring AOP中,切面的应用较为简单,为了便于理解,咱们能够把切面理解为一个实现具体业务的类,例如计算Dao层方法执行时间的类。
注:AspectJ中的AOP实现比Spring AOP复杂的多,本文主要以理解Spring AOP为目的,不作深刻的探讨,有兴趣进一步学习的同窗能够参考附件中的AspectJ的官方文档
前面咱们提到AOP主要应用一些非核心业务逻辑中,咱们看看AOP常见的应用场景
Wiki:en.wikipedia.org/wiki/Aspect…
AspectJ:www.eclipse.org/aspectj/doc…
Spring AOP:docs.spring.io/spring/docs…