目录
1、静态AOP和动态AOP
1.1、静态AOP
静态AOP,即第一代AOP,以最初的AspectJ为杰出代表,其特点是,相应的横切关注点以Aspect形式实现之后,会通过特定的编译器,将实现后的Aspect编译并织入到系统的静态类中。
静态AOP的优点是,Aspect直接以Java字节码的形式编译到Java类中,Java虚拟机可以像通常一样加载Java类运行,不会对整个系统的运行造成任何的性能损失。缺点是,灵活性不够。如果横切关注点需要改变织入到系统的位置,就需要重新修改Aspect定义文件,然后使用编译器重新编译Aspect并重新织入到系统中。
1.2、动态AOP
动态AOP,又称为第二代AOP,该时代的AOP框架或产品,大都通过Java语言提供的各种动态特性来实现Aspect织入到当前系统的过程。
第二代AOP的AOL大都采用Java语言实现,AOP的各种概念实体全部都是普通的Java类,所以很容易开发和集成。Aspect跟Class一样最终以Class身份作为系统的一等公民存在,与静态AOP最大的不同就是,AOP的织入过程在系统开始运行之后进行,而不是预先编译到系统类中,而且织入信息大都采用外部XML文件格式保存,可以在调整织入点以及织入逻辑单元的同事,不必变更系统其它模块,甚至在系统运行的时候,也可以动态更改织入逻辑。
但动态AOP在引入灵活性以及易用性的同时,也会不可避免的引入相应的性能问题。因为动态AOP的实现产品大都在类加载或者系统运行期间,采用对系统字节码进行操作的方式来完成Aspect到系统的织入,难免会造成一定的运行时性能损失。但随着JVM版本的提升,对反射以及字节码操作技术的更好支持,这样的性能损失在逐渐减少,大多数情况下,这种性能损失是可以容忍的。
2、Java平台上的AOP实现机制
2.1、动态代理
JDK1.3之后,引入了动态代理机制,可以在运行期间,为相应的接口(interface)动态生成对应的代理对象。所以,我们可以将横切关注点逻辑封装到动态代理的InvocationHandler中,然后在系统运行期间,根据横切关注点需要织入的模块位置,将横切逻辑织入到相应的代理类中。
这种方式实现的唯一缺点或者说优点就是,所有需要织入横切关注点逻辑的模块类都得实现相应的接口,因为动态代理机制只针对接口有效。
2.2、动态字节码增强
Java虚拟机加载的class文件都是符合一定规范的,所以,只要交给Java虚拟机运行的文件符合Java class规范,程序的运行就没有问题。通常的class文件都是从Java源代码文件使用Javac编译器编译而成的,但只要符合Java class规范,我们也可以使用ASM或者CGLIB等Java工具库,在程序运行期间,动态构建字节码的class文件。
在这样的前提下,我们可以为需要织入横切逻辑的模块类在运行期间,通过动态字节码增强技术,为这些系统模块类生成相应的子类,而将横切逻辑加到这些子类中,让应用程序在执行期间使用的是这些动态生成的子类,从而达到将横切逻辑织入系统的目的。
使用动态字节码增强技术,即使模块类没有实现相应的接口,我们依然可以对其进行扩展,而不用想动态代理那样受限于接口。不过,这种实现机制依然存在不足,如果需

本文详细探讨了AOP(面向切面编程)的两大类型——静态AOP和动态AOP,分析了它们的优缺点。静态AOP如AspectJ在编译时将Aspect编译到Java类中,而动态AOP则通过动态代理、字节码增强等技术在运行时织入。此外,文章还介绍了Java平台上AOP的四种实现机制:动态代理、动态字节码增强、Java代码生成和自定义类加载器,并详细阐述了AOP的相关概念,包括Joinpoint、Pointcut、Advice、Aspect、织入和目标对象。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



