我正在学习 Spring AOP ,我有以下疑问。
据我所知,有两种方法可以将AOP行为实现到Java应用程序中:
AspectJ:这是第一个使用字节码修改进行方面编织的原始AOP技术。
Spring AOP:基于Java的AOP框架,使用AspectJ集成,使用动态代理进行方面编织。
我的怀疑是: Spring AOP 究竟意味着是否与AspectJ集成的AOP框架?那么它依次使用 AspectJ ?或者什么?
第二个疑问与 Spring AOP 的Spring配置有关,我知道我可以这样做:
1)使用Java配置类:
@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 和 < /强>
它究竟意味着什么?
答案 0 :(得分: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
正如您所看到的,Spring依赖项传递包含AspectJ weaver。
话虽如此,documentation表示
Spring 2.0引入了一种使用基于模式的方法或@AspectJ注释样式编写自定义方面的更简单,更强大的方法。这两种样式都提供完全类型的建议和AspectJ切入点语言的使用,同时仍然使用Spring AOP进行编织。
干杯,
答案 1 :(得分:3)
在最开始(直到1.2版本),Spring过去常常使用AOP Alliance作为提供AOP支持的框架。 然后,Spring改变并开始使用AspectJ。
AspectJ和Spring AOP的主要区别在于,首先,Spring AOP提供了AspectJ提供的功能子集,而且Spring AOP使用动态代理作为实现它的策略,而AspectJ增强了编译类的字节码,使用他们的特定编译器(您需要运行后编译过程以使您的编译类准备就绪)。
换句话说,Spring AOP在幕后使用AspectJ引擎来提供AOP,这使得您可以以更简单的方式使用该强大框架的强大功能。 但要注意Spring AOP不提供所有AspectJ功能
查看this post了解更多信息