spring AOP-----总体概念

静态AOP 时代:

其特点是,相应的横切关注点以Aspect形式实现之后,会通过特定的编译器,将实现后的Aspect编译并织入到系统的静态类中。优点是,Aspect直接以java 字节码的形式编译到Java 类中,java虚拟机可以像通常一样加载java类运行(因为编译完成的Aspect是完全符合java类的规范的),不会对整个系统的运行造成任何的性能损失。缺点就是不灵活,如果横切面关注点需要改变织入到系统的位置,就需要重新修改Aspect 定义文件,然后使用编译器重新编译Aspect并重新织入到系统中。

动态AOP 时代:

大都采用java 语言实现,AOP的织入过程在系统运行开始之后进行,而不是预先编译到系统中,而且织入信息大都采用外部XML文件格式保存,可以在调整织入点以及织入逻辑单元的同时,不必变更系统其他模块甚至在系统运行时,动态改变织入逻辑。

Java平台上的AOP实现机制:

常用方式:

动态代理(Dynamic Proxy)机制:可以在运行期间,为相应的接口(Interface)动态生成对应的代理对象。我们可以将横切关注点逻辑封装到动态代理的InvocationHandler中,然后在系统运行期间,根据横切关注点需要织入的模块位置,将横切逻辑织入到相应的代理类中,以动态代理为载体的横切逻辑,就可以与系统其他模块一起工作了。优点或者缺点:所有需要织入横切关注点逻辑的模块都得实现相应的接口,因为动态代理机制只针对接口有效。【动态代理是在运行期间使用反射,相对编译后的静态类的执行,性能上要稍微差一点】

动态字节码增强:为需要织入横切逻辑的模块类在运行期间,通过动态字节码增强技术,为这些系统模块类生成相应的子类,将横切逻辑加到这些子类中,让应用程序在执行期间使用的是这些动态生成的子类,从而达到将横切逻辑织入系统的目的。优点即使模块类没有实现相应的接口,依然可以对其进行扩展,缺点就是如果需要扩展的类或者类中的方法声明为final 的话,则无法对其子类化的扩展。

自定义类加载器:所有的java 程序的class 都要通过相应的类加载器(Classloader)加载到Java虚拟机之后才可以运行。默认的类加载器会读取class字节码文件,然后按照class字节码规范,解析并加载这些class文件到虚拟机运行。如果能够在这个class文件加载到虚拟机运行期间,将横切逻辑织入到class文件也可以的。

AOP的几个公民:

JoinPoint:在系统运行之前,AOP的功能模块都需要织入到oop的功能模块中。所以,要进行这种织入过程,我们需要知道在系统的哪些执行点上进行织入操作,这些将要在其之上进行织入操作的系统执行点就称之为Joinpoint。常用的joinPoint类型为方法级别的调用(Method Call)方法调用执行(Method Call execution)构造方法执行,字段设置/获取(set/get)异常处理执行,类初始化。

PointCut:代表的是Joinpoint 的表述方式。将横切逻辑织入到当前系统的过程中,需要参照PointCut规定的Joinpoint信息,才可以知道应该往系统的哪些Jointpoint上织入横切逻辑。

Advice:是单一的横切关注点逻辑的载体,他代表将会织入到Jointpoint的横切逻辑。

Aspect:是对系统中的横切关注点逻辑进行模块化封装的AOP概念实体。通常情况下,Aspect可以包含多个Pointcut以及相关Advice定义。

织入和织入器:只有经过织入过程之后,以Aspect 模块化的横切关注点才会集中成到OOP的现存系统中。

目标对象:符合Pointcut所指定的条件,将在织入过程中被织入横切逻辑的对象,称为目标对象。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章