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

时间:2015-06-03 12:16:50

标签: java spring aop aspectj spring-aop

我正在学习 Spring AOP ,我有以下疑问。

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

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

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

  3. 我的怀疑是: 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 < /强>

    它究竟意味着什么?

2 个答案:

答案 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了解更多信息