AOP是很多直觉难以理解的术语的根源。幸运的是,你只要理解三个概念,就可以编写AOP模块。这三个概念是:advice,pointcut和 advisor。advice是你想向别的程序内部不同的地方注入的代码。pointcut定义了需要注入advice的位置,通常是某个特定的类的一个 public方法。advisor是pointcut和advice的装配器,是将advice注入主程序中预定义位置的代码。
关注点(Concern):
关注点也就是我们要考察或解决的问题.
核心关注点:是指一个系统中的核心功能,也就是一个系统中跟特定业务需求联系最紧密的商业逻辑.
横切关注点<交叉关注点>:分散在每个模块中解决同一样的问题的关注点.
切面(Aspect):
切面是关注点的模块化,关注点可能横切多个对象。它除了包括属性、方法以外,同时还包括切入点Pointcut、增强Advice等,另外,切面中还可以给一个现存的类添加属性、构造函数,指定一个类实现某一个接口、继承某一个类等。
连接点(Join point):
连接点也就是运用程序执行过程中需要插入切面模块的某一点.连接点主要强调的是一个具体的"点"概念.这个点可以是一个方法、一个属性、构造函数、类静态初始化块,甚至一条语句。
切入点(Pointcuts):
切入点指一个或多个连接点,可以理解成一个点的集合。
切面:
关注点的模块化,关注点可能横切多个对象.
增强或通知(Advice):
增强(Advice)里面定义了切面中的实际逻辑(即实现),比如日志的写入的实际代码,或是安全检查的实际代码。或者说:增强(Advice)是指在定义好的切入点处,所要执行的程序代码。
一般情况下增强(通知)主要有前增强、后增强、环绕增强三种基本类型。
前增强(Before advice):是指在连接点之前,先执行增强中的代码 。
后增强(After advice):是指在连接点执行后,再执行增强中的代码。后增强一般分为连接点正常返回增强及连接点异常返回增强等类型。
环绕增强(Around advice):是一种功能强大的增强,可以自由改变程序的流程,连接点返回值等。在环绕增强中出除了可以自由添加需要的横切功能以外,还需要负责主动调用连接点(通过proceed)来执行激活连接点的程序。
引介(Introduction):
引介是指给一个现有的类添加方法或字段属性,引介还可以在不改变现有类代码的情况下,让现有的Java类实现新的接口,或者为其指定一个父类从而实现多重继承。相对于增强(Advice)可以动态改变程序的功能或流程来说,引介(Introduction)则用来改变一个类的静态结构。
织入(Weaving):
织入是指把解决横切问题的切面模板,与系统中的其它核心模块通过一定策略或规则组合到一起的过程。在Java领域,主要包括以下三种织入方式:
1、运行时织入:即在JAVA运行的过程中,使用JAVA提供代理来实现织入。根据代理产生方式的不同,运行时织入又可以进一步分为2SE动态代理及动态字节码生成两种方式。由于J2SE动态代理只能代理接口,因此,需要借助于一些动态字节码生成器来实现对类的动态代理。大多数AOP实现都是采用这种运行时织入的方式。
2、类加载器织入:指通过自定义的类加载器,在虚拟机JVM加载字节码的时候进行织入。
3、编译器织入:使用专门的编译器来编译包括切面模块在内的整个应用程序,在编译的过程中实现织入,这种织入是功能最强大的。
拦截器(Interceptor):
拦截器是用来实现对连接点进行拦截,从而在连接点前或后加入自定义的切面模块功能。
目标对象(Target object):
指在基于拦载器机制实现的AOP框架中,位于拦截器链上最未端的对象实例。一般情况下,拦截器未端都包含一个目标对象,通常也就实际业务对象。当然,也可以不使用目标对象,直接把多个切面模块组织到一起,形成一个完整最终应用程序,整个系统完全使用基于AOP编程方法实现,这种情况少见。
AOP代理(Proxy):
AOP代理是指在基于拦截器机制实现的AOP框架中,实际业务对象的代理对象。这个代理对象一般衩切面模块引用,AOP的切面逻辑正是插入在代理对象中来执行的。AOP代理的包括J2SE的代理以及其它字节码生成工具生成的代理两种类型。
面向对象编程(OOP)解决问题的重点在于对具体领域模型的抽象,而面向切面编程(AOP)解决问题的关键则在于对关注点的抽象。
Spring-AOP:使用基于代理及拦截器的机制,与Spring IOC容器融入一体的AOP框架.Spring AOP采用运行时 织入方式,使得可以在基于
Sping框架的应用程序中使用各种声明式系统级服务.