AOP为Aspect Oriented Programming的缩写,即面向切面编程。
众所周知,面向对象的代码重用一般是继承和委托。而面向切面编程提供了一种取代继承和委托的方式。我们仍然是在一个地方定义公用功能,但可以明确定义这个功能在哪里,以何种方式应用,并且不必修改会受影响的类。
这样一来,交叉事务就可以被模块化到特殊的对象里,这些对象就被称为“切面”。切面有助于实现交叉事务的模块化。交叉事务会影响到程序的多个位置的功能。比如安全就是一个交叉事务。
这样做有两个好处:
- 每个事务的逻辑位于一个位置,而不是分散到多处代码。
- 服务模块更简洁,因为他们只包含用于主要功能(或核心功能)的代码,辅助事务的代码被转移到切面。
AOP术语
通知: 切面的功能被称为“通知”。通知定义了切面是什么以及何时调用。
连接点:连接点就是程序执行过程中能够插入切面的一个点。
切入点 : 一个切面不一定要通知程序里全部的连接点。
如果说通知定义了切面的”什么”和”何时”,那么切入点就定义了”何地”。切入点的定义匹配通知要织入的一个或多个连接点。
我们通常使用明确的类和方法名称,或是利用正则表达式定义匹配的类和方法名称模板来指定这些切入点。
切面:切面是通知和切入点的结合。通知和切入点共同定义了关于切面的全部内容(它的功能、在何时何地完成其功能)。
目标 : “目标”是被通知的对象,它可以是我们编写的一个对象,或是第三方对象。如果没有AOP,这个对象就必须包含自己的主要逻辑和交叉事务的逻辑。通过使用AOP,目标对象就可以着重与自己的主要逻辑,不必考虑要被应用的任何通知。
代理:“代理”是向目标对象应用通知之后被创建的对象。对于客户端对象来说,目标对象(AOP之前)和代理对象(AOP之后)是一样的。
织入:“织入”是把切面应用到目标对象来创建新的代理对象的过程。切面在指定连接点织入到目标对象。在目标对象的生命周期里有
多个时机可以发生织入过程:
- 编译时:切面在目标类编译时被织入。这需要特殊的编译器,AspectJ的织入编译器就以这种方式织入切面。
- 类加载时:切面在目标类加载到JVM时被织入,这需要特殊的ClassLoader,它可以在目标类被加载到程序之前增强类的字节代码。AspectJ5的“加载时织入(LTW)”就以这种方式支持织入切面。
- 运行时:切面在程序运行的某个时刻被织入。一般情况下,在织入切面时,AOP会动态创建一个代理对象来委托给目标对象。这就是SpringAOP织入切面的方式。