AOP框架

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

目录

1、静态AOP和动态AOP

1.1、静态AOP

1.2、动态AOP

2、Java平台上的AOP实现机制

2.1、动态代理

2.2、动态字节码增强

2.3、Java代码生成

2.4、自定义类加载器

3、AOP的相关概念

3.1、Joinpoint

3.2、Pointcut

3.3、Advice

3.4、Aspect

3.5、织入和织入器

3.6、目标对象


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 框架主要分为 Java 平台上的和 .NET 平台上的,下面是一些主流的 AOP 框架: --- ### Java 平台上的 AOP 框架: 1. **Spring AOP** - Spring 框架自带的 AOP 模块。 - 基于动态代理实现(JDK 动态代理和 CGLIB)。 - 适用于 Spring 管理的 Bean。 - 功能相对简单,适合在 Spring 应用中使用。 2. **AspectJ** - 最强大的 AOP 框架之一。 - 支持编译时织入、类加载时织入和运行时织入。 - 提供完整的 AOP 支持,功能比 Spring AOP 更强大灵活。 - 可独立使用,也可与 Spring 集成。 3. **JBoss AOP** - JBoss 提供的 AOP 框架。 - 支持运行时织入和类加载时织入。 - 已逐渐被其他框架取代。 4. **ByteBuddy** - 虽然不是纯粹的 AOP 框架,但常用于运行时字节码增强。 - 在实现 AOP 逻辑时被广泛使用。 --- ### .NET 平台上的 AOP 框架: 1. **PostSharp** - .NET 平台上最流行的 AOP 框架。 - 支持编译时织入。 - 提供丰富的 AOP 功能,如日志、缓存、权限控制等。 2. **Castle DynamicProxy** - 基于动态代理实现的 AOP 工具。 - 常用于拦截方法调用。 - 通常与其他框架(如 Autofac、NHibernate)集成使用。 3. **Unity Interception** - Microsoft Unity 容器提供的拦截机制。 - 支持通过配置实现 AOP。 --- ### Python 中的 AOP 实现(非传统 AOP 框架,但可实现类似功能): 1. **装饰器(Decorators)** - Python 原生语法支持,可实现类似 AOP 的前置/后置处理逻辑。 --- ### 示例代码(Spring AOP 简单切面): ```java @Aspect @Component public class LoggingAspect { @Before("execution(* com.example.service.*.*(..))") public void beforeMethod(JoinPoint joinPoint) { System.out.println("调用方法前:" + joinPoint.getSignature().getName()); } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值