Spring AOP 使用 AspectJ 来工作还是什么?

Spring AOP use AspectJ to works or what?

正在研究SpringAOP,有以下疑问

据我所知,有两种方法可以将 AOP 行为实现到 Java 应用程序中,它们是:

  1. AspectJ:第一个使用字节码修改切面织入的原创AOP技术

  2. Spring AOP: Java 基于 AOP 框架与 AspectJ 集成,使用动态代理进行切面编织。

我的疑问是:Spring AOP 是一个集成了 AspectJ 的 AOP 框架究竟意味着什么?那么它反过来使用AspectJ?或者什么?

第二个疑问与SpringAOP的Spring配置有关,我知道可以这样实现:

1) 使用 Java 配置 class:

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

2) 使用 XML:

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

所以,在这两种配置中,似乎 Spring AOP 使用 AspectJ 因为在这些配置中我有:@EnableAspectJAutoProxy

具体是什么意思?

这可能会回答您的问题 - 这是 mvn dependency:tree 中使用 spring-aop:

的项目的摘录
[INFO] |  +- org.springframework:spring-aop:jar:3.2.3.RELEASE:compile
[INFO] |  |  \- aopalliance:aopalliance:jar:1.0:compile
[INFO] |  +- org.springframework:spring-aspects:jar:3.2.3.RELEASE:compile
[INFO] |  |  +- org.aspectj:aspectjweaver:jar:1.7.2:compile

如您所见,Spring 依赖传递地包含 AspectJ weaver。

也就是说,documentation 表示

Spring 2.0 introduces a simpler and more powerful way of writing custom aspects using either a schema-based approach or the @AspectJ annotation style. Both of these styles offer fully typed advice and use of the AspectJ pointcut language, while still using Spring AOP for weaving.

干杯,

最开始(直到1.2版本),Spring曾经使用AOP Alliance作为框架来提供AOP支持。 然后,Spring 改变并开始为此使用 AspectJ。

AspectJ 和 Spring AOP 的主要区别在于,首先,Spring AOP 提供了 AspectJ 提供的功能的子集,并且 Spring AOP 使用动态代理作为策略来实现它,而 AspectJ 增强了已编译 class 的字节码,使用它们特定的编译器(你需要 运行 一个 post-compile 过程来获得你的编译 classes准备出发了)。

换句话说,Spring AOP 在幕后使用 AspectJ 引擎来提供 AOP,这让您能够以更简单的方式使用该强大框架的强大功能。 但要注意 Spring AOP 不提供所有 AspectJ 特性

查看 this post 了解更多信息