1、AOP含义
AOP 是Aspect Orinented Programing 意思就是“面向切面编程”。
2、AOP术语(如连接点、切点等)
Spring提供的AOP只是针对方法级别的切面编程,即连接点针对的都是方法。
2.1、连接点(Joinpoint)
一个类或者一段程序代码拥有一些具有边界性质的特定点即为连接点,不过spring仅仅支
持方法级别的连接点,即仅仅能在方法调用前、方法调用后、方法异常时候等等执行点镜
进行织入增强。 从某种意义上来说AOP也可以看成是一个黑客,因为AOP需要在目前类
中或方法中嵌入额外的代码逻辑,而连接点就是AOP向目标类打入楔子的候选锚点。每个
程序类都有多个连接点,如一个拥有两个方法的类,这两个方法就都是连接点。
大白话:连接点就是需要织入代码的地方。
2.2、切点(Pointcut)
在一个程序类中,存在为数众多的连接点中,如何定位到需要增强的连接点呢,这个需要
增强的连接点就是切点,举例说明一下,把连接点比喻为数据里面的数据,而切点相当于
查询条件,及那些符合需要增强的连接点,一个切点可以匹多个连接点。对应spring中
org.springframe.aop.Pointcut接口进行描述,此接口使用类和方法作为连接点的查询条件,
然后spring AOP 的规则解析引擎负责解析切入点所设定的查询条件,找到对应的连接点,
准确来说应该是执行点(执行点非连接点,连接点是方法,而执行点是方法执行之前、之
后等包含方位信息的程序执行点),而切点只是定位到某个方法上,所以如果希望定位到
具体的连接点上的话,还需要提供执行点的方位信息。
大白话:切点代表的是类和方法的定位,也就是那个类的那个方法需要织入代码。
2.3、增强(Advice)
增强是织入连接点上的一段程序代码,除此之外还拥有另一个和连接点相关的信息,这便
是执行点的方位信息。结合执行点的方位信息和切点信息就能定位到特定的连接。正是因
为增强(Advice)既包含添加到目标连接点上的一段执行代码,又包含用于用于定位连接的
执行点方位信息,所以spring提供的增强接口都是带有方位信息的,如BeforeAdvice、
AfterReturningAdvice、ThrowsAdvice等。BeforeAdvice表示在方法调用之前的位置。所以
只有结合切点和增强才能确定特定的连接点并织入增强的代码逻辑。
大白话:增强代表的是横切代码和部分连接点的主方位信息:比如是在方法前还是后织入横切代码。
2.4、目标对象(Target)
增强的代码逻辑织入的目标对象。
2.5、引介(Introduction)
引介是一个特殊的增强,能为类动态的添加属性和方法,这样可以给一个类动态去实现某接口,也可以为类动态的添加接口的实现逻辑,让业务类成为接口的实现类。
2.6、织入(Weaving)
织入是将增强添加到目标类的具体连接点上的过程,AOP就像一台织布机,将目标类、增强、引介天衣无缝的编织到一起。
根据不同的织入实现技术可分为如下:
- 编译期织入:需要使用特殊的java编译器。
- 类装载期织入:需要使用特殊的类装载器。
- 动态代理织入:在运行期为目标类添加增强子类的方式。
Spring采用动态代理织入,AspectJ采用编译期+类装载期织入。
2.7、代理类(Proxy)
一个类被AOP织入增强以后,产生了一个结果类,这个就是代理类,它融合了原类和增强
的逻辑,根据不同的织入方式,代理类即可能和原类具有相同的实现接口,也可能就是原
类的子类,所以可以采用调用原类的方式来调用代理类。
2.8切面(Aspect)
切面由切点+增强+引介组成,既包含横切逻辑的定义,也包含连接点的定义。Spring AOP
就是负责实施切面的框架,它将切面所定义的横切逻辑织入所指定的连接点中。Spring AOP
的两大工作重心就是:
1:如何通过节点和增强定位到连接点上。
2:如何在增强中编写切面的代码。
大白话:切面指的是某些类的某些方法在前面还是在后面织入一段横切代码。
所以切面 = 切点(某些类某些方法的定位)+ 增强(横切代码、在方法前还是后的方位)。
也就是说增强提供了横切代码和连接点的方位信息,如织入到方法前、后等,而切点进一步描述了织入那些类的那些方法上,它两共同表示了切面。
3、AOP的实现者
AspectJ:在编译器提供横切代码织入。
AspectWerkz:在运行期或类装载期提横切代码织入。
AspectJ 跟AspectWerkz 已经合并,合作后发布的第一个版本是AspectJ5。
Spring AOP:使用纯Java实现,只在运行期通过代理的方式向目标类织入横切代码,侧重于提供一种和SpringIOC 容器整合的AOP实现,在spring中可以无缝的将SpringAOP、SpringIOC、AspectJ整合在一起。