Spring AOP和AspectJ有什么区别?
1. 面向的对象不同
- Spring AOP
Spring AOP 是针对 Spring 框架的 AOP 实现。它依赖于 Spring 框架进行实施和管理,因此它需要使用 Spring 的容器和其他基础设施。
- AspectJ
AspectJ 是 Java 世界中独立的 AOP 框架,它不依赖于任何框架或容器。因此,除了 Java 应用程序之外,它还可以应用于其他环境,例如 Java EE 应用程序、OSGi 环境、Android 环境等。
2. AOP 实现方式不同
- Spring AOP
Spring AOP 使用代理的方式实现 AOP。Spring 利用 JDK 动态代理或 CGLIB 代理创建代理对象,代理对象包装目标对象并拦截指定的切点方法,以执行通知。
- AspectJ
AspectJ 支持两种方式实现 AOP。第一种方式是编译时织入,即在编译时将切面代码织入到目标类中。第二种方式是运行时织入,即在目标类加载时通过修改字节码方式织入切面代码。
3. 支持的切面类型不同
- Spring AOP
Spring AOP 支持比较常见的切面类型,包括方法执行切面、异常拦截切面、前置和后置通知切面等。
- AspectJ
AspectJ 相比 Spring AOP 支持更多的切面类型,包括字段拦截器切面、构造器调用切面、注解切面等。AspectJ 还支持自定义注解和注解处理器,以增强 Java 语言的元素。
4. AOP 表达式不同
- Spring AOP
Spring AOP 支持使用 AspectJ 表达式语言(简称为“SpEL”)编写切点表达式。但是,Spring AOP 只支持 AspectJ 表达式的一部分,如 method execution、bean references、args 等。
- AspectJ
AspectJ 使用更为丰富和复杂的切点表达式。在 AspectJ 中,切点表达式可以包含类、方法、参数、返回值、异常等元素,并且可以使用逻辑运算符进行组合。
5. 性能差异
- Spring AOP
Spring AOP 的实现基于代理,这意味着 Spring 需要在运行时创建代理对象,并在每次方法调用时拦截代理。这可能会导致一定的性能开销。
- AspectJ
AspectJ 提供编译时织入和运行时织入两种方式来实现 AOP。编译时织入可以在编译应用程序时织入切面代码,因此会更加高效,而运行时织入需要在应用程序运行时动态织入切面代码,因此性能开销可能会更大。但是,AspectJ 本身是一个底层的 AOP 框架,因此相对于 Spring AOP 来说,它更精细和高效。
文章对比了SpringAOP和AspectJ在面向对象、实现方式、切面类型、AOP表达式和性能上的差异。SpringAOP基于代理,适用于Spring框架,而AspectJ独立且支持更多切面类型和编译时织入,提供更高效率。
816

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



