AOP的一些基本概念
增强(Advice):增强定义了切片做什么和何时做。Spring切片有以下5种增强
-
- Before--增强功能发生在被增强函数调用之前
- After--增强功能发生在被增强函数完成后,不管怎样完成(正常推出、抛出异常)
- After-returning--增强功能发生在被增强函数成功完成后
- After-throwing--增强功能发生在被增强函数抛出异常后
- Around--增强包装被增强方法,在被增强函数调用前后提供一些功能
连接点(Join points):你的应用程序可能有成千上万次机会被增强。这些机会就是连接点。一个连接点是在程序执行过程中切面可以被插入的点。这个点可能是一个方法被调用、一个异常被抛出、甚至一个域(成员变量)被修改。你的切片的代码可以在这些点被插入到应用程序的正常流程中以增加新的行为。
切入点(Pointcuts):如果增强定义了切片做什么和何时做,那么切入点定义了在了哪里做。一个切入点的定义包括了一个或多个增强可以被织入的连接点。你可以通过显式的类和方法名或者常规的匹配类和方法名模型的表达式来指定连接点。
切面(Aspects):一个切面是增强和切入点的集合。
引入(Introductions):引入允许你为某个已有的类增加新的方法或者属性。
织入(Weaving):织入是一个将切片应用的一个目标对象以创建一个新的代理对象的过程。切片会在特定的连接点被织入到目标对象中。织入可以发生在以下几个目标对象生命周期的节点上。
-
-
- 编译期--切片在目标对象被编译后织入。这需要一个特殊编译器。AspectJ的织入编译器这样织入切片。
- 类加载期--切片在目标对象被加载进JVM后织入。这需要一个特殊的ClassLoader(在类被引入应用之前增强目标对象的比特码)。AspectJ 5的加载时织入(LTW)支持这种织入方式。
- 运行时--切片在应用运行的某个时间被织入。通常,AOP容器动态地生成一个代理对象委托目标对象织入切片。这正是Spring AOP的实现方式。
-
Spring的AOP支持
并非所有的AOP框架都是一样的,它们可能通过连接点模型的丰富程度不同进行区分,也可能通过织入切片方式不同区分。无论怎样,创建切入点以定义切片织入的连接点的能力是AOP框架的关键。
Spring对AOP的支持有以下4种方式:
-
-
- Classic Spring proxy-based AOP
- Pure-POJO aspects
- @AspectJ annotation-driven aspects
- Injected AspectJ aspects (available in all versions of Spring)
-
前3种方式是Spring自己的实现。Spring通过动态代理实现AOP。因此,Spring AOP受限于方法拦截。
第一种方式太过成就,已经很少应用,这里不再赘述。
通过aop命名空间,你可以将pure POJOs变为切片。事实上,这些POJOs仅提供响应切入点调用的方法。不幸地是,这种技术需要XML配置,但是这是一种简单的声明式地将任何对象变为切片的方式。
Spring仅支持函数形式的连接点。