gpt4 book ai didi

java - Spring中AOP配置相关的一些疑惑

转载 作者:行者123 更新时间:2023-11-29 03:14:49 24 4
gpt4 key购买 nike

我正在学习 Spring Core 认证,我对 Spring 如何处理 AOP 有疑问。

阅读文档似乎明白了在 Java 中存在两种获取 AOP 的方法:

  1. 使用AspectJ,使用字节码修改进行切面编织,提供了一种成熟的面向切面编程语言。 (所以在我看来,AspectJ 是一种不同的语言,可以与 Java 集成以提供 AOP 特性)。

  2. Spring AOP:在 Spring 框架中使用,该框架使用动态代理进行方面编织而不是字节码修改。

所以我的疑惑主要有以下几点:

1) 阅读文档发现以下方法可以将AOP 支持 添加到我的Spring 应用程序中:

使用 JAVA 配置类:

@Configuration
@EnableAspectJAutoProxy
@ComponentScan(basePackages=“com.example”)
public class AspectConfig {
...
}

使用 XML 配置:

<beans>
<aop:aspectj-autoproxy />
<context:component-scan base-package=“com.example” />
</beans>

如您所见,在两种配置中都引用了 AspectJ:

@EnableAspectJAutoProxy

<aop:aspectj-autoproxy />

为什么?如果 Spring 使用 Spring AOP 而不是 AspectJ 为什么在 Spring 中配置 AOP 时会引用 AspectJ

2) 在前面的示例中展示了两种配置 Spring 的方法:通过 Java 配置类 和通过 XML 配置。我知道存在第三种配置 Spring 应用程序的方法:使用 annotations。那么是否存在使用注解配置 AOP 的方法?

最佳答案

我认为这些在名称中引用 AspectJ 的 Spring AOP 设置确实比帮助更令人恼火。我能理解你为什么感到困惑。 Spring AOP 与AspectJ 确实是不同的概念。正如您所说:Spring AOP 中的动态 JDK 或 CGLIB 代理与 AspectJ 中编译或加载时的字节码检测。其他区别是:

  • AspectJ 编译时编织需要一个名为Ajc 的特殊编译器。它基本上是一个 Eclipse Java 编译器 Ecj,由执行检测的方面编织器增强。相比之下,Spring AOP 在运行时创建动态代理。
  • 在 AspectJ 中有两种语法变体:原生的和基于注解的。前者更优雅,更富表现力,是 Java 的超集,肯定需要 Ajc 编译。后者使用Java注解,可以用Javac编译,但是需要Ajc(编译时)和织入中都包含的切面编织器代理 aspectjweaver.jar(加载时间)“完成”它们并使它们在运行时可用。两种变体都需要包含在 aspectjrt.jar(非常小,用于运行时编译时编织方面)和 aspectjweaver.jar(大得多,用于对于加载时织入,包含运行时和织入器)。
  • AspectJ 适用于任何 Java 类,它不需要甚至不知道 Spring 框架。 Spring AOP 需要 Spring 框架作为基础,您只能使用它来检测 Spring Beans/Components,而不是与 Spring 无关的 POJO。
  • AspectJ 更高效,因为它避免了代理。但是 Spring AOP 无论如何都是 Spring 框架的可选部分,因此如果您使用 Spring 并且只需要 Spring Beans 的方法执行拦截,那么使用它就非常有意义。
  • Spring AOP 使用 AspectJ 切入点语法的一个子集。也许这是 Spring AOP 使用 AspectJ 引用的微妙原因,但我仍然认为不区分这两个概念是一个错误的决定关于命名法,彼此更清楚。此外,公共(public)点语言子集在一个名为 aopalliance.jar 的小 JAR 中定义,因为很久以前所谓的“AOP 联盟”已经定义了该语法。不过,当今占主导地位且迄今为止最强大的 AOP 语言是 AspectJ,因此实际上 AspectJ(由 Eclipse 维护)是该领域的领导者,IMO。
  • 当我说 Spring AOP 使用 AspectJ 语法的一个子集时,相反,它意味着 AspectJ 提供了一个超集。有更多切入点类型,例如 call()set()get() 等,您有更多选择来拦截连接点并通过建议或类型间定义将横切关注点应用于您的代码库。

我不明白您的问题 #2。你例子中的配置类确实使用了注解,所以没有第三种方式。 ;-) 但是在 Spring 中有一种古老的、非常过时的 AOP 方法,称为拦截器。它是早期 AOP 方法的遗留物,现在已经过时了,尽管它仍然可用。

Spring AOP 和 AspectJ 都可以通过 XML 或 Spring 中的注解进行配置。 :-)

关于java - Spring中AOP配置相关的一些疑惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27332950/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com