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

And*_*ili 8 java aop spring aspectj spring-aop

我正在研究Spring AOP,我有以下疑问.

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

  1. AspectJ:这是第一个使用字节码修改进行方面编织的原始AOP技术.

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

我的疑问是:究竟什么意味着Spring AOP是一个带有AspectJ集成的AOP框架?那么它依次使用AspectJ?或者是什么?

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

1)使用Java配置类:

@Configuration
@EnableAspectJAutoProxy
@ComponentScan(basePackages=“com.example”)
public class AspectConfig {
    ...
}
Run Code Online (Sandbox Code Playgroud)

2)使用XML:

<beans>
    <aop:aspectj-autoproxy />
    <context:component-scan base-package=“com.example” />
</beans>
Run Code Online (Sandbox Code Playgroud)

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

它究竟意味着什么?

And*_*rup 6

这可能会回答您的问题-这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
Run Code Online (Sandbox Code Playgroud)

如您所见,Spring依赖关系可传递地包括AspectJ编织器。

话虽如此,文档指出

Spring 2.0引入了一种使用基于模式的方法或@AspectJ批注样式来编写自定义方面的更简单,更强大的方法。这两种样式都提供了完全类型化的建议并使用了AspectJ切入点语言,同时仍然使用Spring AOP进行编织。

干杯,

  • 请注意,从 spring-aop 3.3.0 开始,spring-aop 工件不再依赖于 aopalliance:aopalliance:1.0,而是直接捆绑(可能已修改)org.aopalliance 类。当与使用 aopalliance 的其他库(特别是 com.google.inject:guice)组合时,这将导致类路径上出现多个版本的 org.aopalliance 类。 (2认同)