Spring AOP的VS的AspectJ(Spring AOP vs AspectJ)

2019-08-31 09:57发布

我的印象中,Spring AOP是最适合用于特定应用的任务,如安全,日志,交易等,因为它使用了自定义Java5的注解为框架之下。 然而,AspectJ的似乎更加友好的设计图案明智的。

任何人都可以突出在Spring应用程序使用Spring AOP VS的AspectJ的各种利弊?

Answer 1:

Spring的AOP优点

  • 这是简单得多的AspectJ使用,因为你不必使用LTW( 负载时编织 )或AspectJ编译器。

  • 它采用代理模式和Decorator模式

Spring的AOP缺点

  • 这是基于代理技术的AOP,所以基本上你只能使用方法,执行joinpoints。
  • 调用同一类内的另一种方法,当方面不被应用。
  • 可以有一点点运行时开销。
  • Spring的AOP不能一个方面添加到不是由Spring工厂创建什么

AspectJ的优点

  • 这支持所有joinpoints。 这意味着你可以做任何事情。
  • 有运行时开销比Spring AOP的少。

AspectJ的缺点

  • 小心。 请检查您的方面被编织到你想被编织仅什么。
  • 你需要额外的构建过程中使用AspectJ编译或必须设置LTW(加载时织入)


Answer 2:

除了别人怎么说-只是另一种方式, there are two major differences

  1. 一个是关系到织造的类型。
  2. 另一个连接点的定义。

Spring的AOP:运行时通过代理服务器使用的概念编织dynamic proxy if interface exists or cglib library if direct implementation provided.

AspectJ的:编译时通过编织AspectJ Java Tools(ajc compiler)如果可用的源代码或编译后编织(使用编译后的文件)。 此外,加载时间与Spring编织可以启用-它需要aspectj定义文件,并提供灵活性。

编译时编织能够提供的性能优势(在某些情况下),也将joinpoint definition in Spring-aop is restricted to method definition only which is not the case for AspectJ.



Answer 3:

附加的注释: 如果高负载下的性能是非常重要的,你要的AspectJ比Spring AOP的速度9-35x。 10ns的VS 355ns听起来并不多,但我已经看到了使用方面的地段人。 10K的价值方面。 在这些情况下,您的要求会打千方面。 在这种情况下,您要添加毫秒这一要求。

见基准测试 。



Answer 4:

弹簧用户手册将给大量的信息,直接从马的嘴。

本章6.4 -选择要使用AOP声明风格的是你死了,因为它讨论了两者的优点和缺点。

该段6.1.2 - Spring AOP的Capabilites和目标及章节6.2 - @Aspect支持和6.8 -使用AspectJ的Spring应用程序应该是particularily有趣。



Answer 5:

Spring AOP是Spring框架的主要组成部分之一。 在非常基础的阶段,Spring框架是基于IOC和AOP。 在Spring的官方当然有在它说一个幻灯片:

该AOP是框架的最重要的部分之一。

为了解AOP在Spring是如何工作的,关键的一点是,当你写使用Spring,我们仪器的看点与建筑为对象的代理,具有框架JDKDynamicProxy如果你的bean实现一个接口或通过CGLIB如果你的bean没有实现任何接口。 请记住,你必须有CGLIB 2.2在类路径,如果你使用Spring 3.2之前的版本。 从春季3.2开始,因为CGLIB 2.2被列入核心是没用的。

在bean创建的框架将创建一个包装你的对象,并增加横切关注点责任,如安全性,事务管理,日志等代理。

以这种方式代理的创建将开始为切入点表达式仪器框架决定什么豆类和方法将作为代理来创建应用。 该意见将是比代码更多的责任。 请记住,在这个过程中捕捉切入点没有被声明为final的唯一的公共方法。

现在,虽然在Spring AOP方面的织造将由容器在容器启动时执行,AspectJ中,你必须通过字节码修改代码的编译后执行此。 出于这个原因,在我看来Spring的解决方案更简单,比的AspectJ更易于管理。

在另一方面,Spring AOP的你不能因为实现是通过代码的修改通过代理完成的,而不是与使用AOP的一切权力。

正如AspectJ,可以在SpringAOP使用加载时编织。 您可以受益于这种功能在春季与试剂和特殊配置,实现@EnabledLoadWeaving或XML。 您可以使用名称空间作为一个例子。 然而在Spring AOP你不能拦截所有的案件。 例如, new命令没有在Spring AOP支持。

然而,在Spring AOP中,你可以通过使用从AspectJ中的使用中获益aspectof在Spring配置bean工厂方法。

对于Spring AOP是基本上是从容器中创建一个代理,所以你可以使用AOP只为春豆的原因。 虽然使用AspectJ您可以使用所有的豆类方面。 比较的另一点是调试和代码行为的可预测性。 Spring AOP实现,将任务从Java编译器预制和所有方面都为您的Spring bean创建代理一个非常酷的方式。 在AspectJ中,如果你修改了代码,你需要更多的编译和深入了解您方面编织可能很难。 即使在春天关闭编织更简单:弹簧删除从配置方面,重新启动和它的作品。 在AspectJ必须重新编译代码!

在加载时编织,AspectJ是比Spring更加灵活,因为Spring并不支持所有的AspectJ的选项。 但在我看来,如果你想改变一个bean的创建过程,更好的办法是管理一个工厂自定义登录,而不是与改变你的新运营商的行为,一个方面的加载时间编织。

我希望这个全景AspectJ和Spring AOP的帮助您了解这两个药水的差异



Answer 6:

考虑你是否方面将是关键任务,并在您的代码的部署是非常重要的。 Spring AOP的将意味着你是依靠加载时织。 这可能会失败编织在我的经验意味着,登录可能存在误差,但不会阻止应用程序而无需方面运行的代码[我要补充的警告,它可能配置它以这样的方式,这是不案件; 但我没有亲自意识到这一点 。 编译时编织避免这一点。

此外,如果你与AspectJ的Maven的插件一起用AspectJ,那么你能对你的方面,用于在CI环境中运行单元测试,并有内置的文物进行了测试,并正确地编织的信心。 虽然你当然可以写弹簧驱动单元测试,你还是不能保证部署的代码将是:如果LTW出现故障时进行了测试。

另一个要考虑的是你是否在你能够直接监控服务器/应用程序启动的,还是您的应用程序部署在的环境下这是不是你的监督[例如它下的成功或失败,其中的环境中托管的应用程序是由客户端托管。 同样,这将指向编译时编织的方式。

五年前,我赞成更多的春天配置AOP,原因很简单,这是更易于使用,并不太可能啃我的IDE。 然而,随着计算能力和可用内存增加了这已远远不象一个问题,CTW与AspectJ的Maven的插件已经成为基于我所上述原因,在我的工作环境更好的选择。



Answer 7:

该文章也有关于该主题的一个很好的解释。

Spring AOP和AspectJ有不同的目标。

Spring AOP的目标是提供跨越的Spring IoC一个简单的AOP实现,以解决程序员面临的最常见的问题。

在另一方面,AspectJ是原来的AOP技术,旨在为客户提供完整的解决方案AOP。



文章来源: Spring AOP vs AspectJ