上篇博客我们了解了什么是AOP,AOP的思想,以及Java代理机制对AOP思想的实现。本篇博客将进入AOP的概念学习,这些概念并不是Spring所特有的,但要真正理解AOP,理解这一系列概念是必须的。
正常来说,应用程序的结构是纵向的,会执行一系列方法的调用,而AOP(面向切面编程)思想,则关注的是应用程序的横向结构。所以会有下面一系列概念:
1.横切性关注点(Cross Cut Concern) :一种独立的服务。此关注点必须是独立的,不与其它业务逻辑耦合。它可能遍布在系统的各个角落,也可能遍布在系统的处理流程之中。例如:如下图的检查安全性等。
2.切面(Aspect) :一个关注点的模块化,生成对应的类,这个类就叫切面。这个关注点可能会横切多个对象。
3.通知(Advice) :对横切性关注点的具体实现。通知有各种类型:其中包括“before”、“throw”和“after”等类型的通知。
通知的类型,具体如下:
(1) 前置通知(Before advice): 在某连接点(join point)之前执行的通知,但这个通知不能阻止连接点前的执行(除非它抛出一个异常)。
(2) 返回后通知(After returning advice): 在某连接点(join point)正常完成后执行的通知:例如,一个方法没有抛出任何异常,正常返回。
(3) 抛出异常后通知(After throwing advice): 在方法抛出异常退出时执行的通知。
(4) 后通知(After (finally) advice): 当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。
(5) 环绕通知(Around Advice): 包围一个连接点(join point)的通知,如方法调用。这是最强大的一种通知类型。 环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。
4.切入点(Pointcut) :可以设定 具体的方法上是否需要 横切性关注点的实现。
5.连接点(Joinpoint) : 在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候,也就是Advice在应用程序上执行的点或时机,Spring只支持方法的Joinpoint。如下图中:调用addUser()方法。这个点也支持属性的修改,如Aspecj支持。
6.织入(Weave) : 把切面(aspect)连接到其它的应用程序类型或者对象上。
7.目标对象(TargetObject) : 被一个或者多个切面(aspect)所通知(advise)的对象。也有人把它叫做 被通知(advised) 对象。
8. AOP代理(AOP Proxy) : AOP框架创建的对象,用来实现切面契约(aspect contract)(包括通知方法执行等功能)。
9. 引入(Introduction) : (也被称为内部类型声明(inter-type declaration))。声明额外的方法或者某个类型的字段。
下面是一张图,看着它,对理解AOP的概念也容易了许多。
【总结】
对于AOP的学习,在理解这些概念的基础上再去实现,一定是事半功倍的。有些概念用专业的术语解释也许比较抽象,等到进入实例的应用,自己对代码有了了解,再转换成自己的理解,最后就都理解了。