Spring AOP vs AspectJ

问题

我的印象是Spring AOP最适合用于特定于应用程序的任务,例如安全性,日志记录,事务等,因为它使用自定义Java5注释作为框架。然而,AspectJ似乎是更友好的设计模式明智。

任何人都可以强调在Spring应用程序中使用Spring AOP和AspectJ的各种优缺点吗?


#1 热门回答(191 赞)

Spring-AOP优点

  • 它比AspectJ更简单,因为你不必使用LTW(加载时编织)或AspectJ编译器。
  • 它使用代理模式和装饰模式

Spring-AOP Cons

  • 这是基于代理的AOP,所以基本上你只能使用方法执行连接点。
  • 在同一个类中调用另一个方法时不应用方面。
  • 可能会有一点运行时开销。
  • Spring-AOP不能为Spring工厂创建的任何东西添加方面

AspectJ专业人士

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

AspectJ Cons

  • 小心。检查你的方面是否仅编织到你想要编织的部分。
  • 你需要使用AspectJ Compiler进行额外的构建过程,或者必须设置LTW(加载时编织)

#2 热门回答(18 赞)

除了其他人所说的 - 只是改写,there are two major differences

  • 一个与编织类型有关。
  • 另一个连接点定义。

**Spring-AOP:**使用概念dynamic proxy if interface exists or cglib library if direct implementation provided.编织代理的运行时间

**AspectJ:**编译时编译通过AspectJ Java Tools(ajc compiler)if源可用或编译后编织(使用编译文件)。此外,可以启用使用Spring编织的加载时间 - 它需要aspectjdefinition文件并提供灵活性。

编译时编织可以提供性能(在某些情况下)以及joinpoint definition in Spring-aop is restricted to method definition only which is not the case for AspectJ.的好处


#3 热门回答(15 赞)

The spring user manual会直接从马的口中提供大量信息。

因为它讨论了两者的优点和缺点,因此第6.4 - Choosing which AOP declaration style to use章对你来说已经没有了。

段落6.1.2 - Spring AOP Capabilites and goals和章节6.2 - @Aspect support6.8 - Using AspectJ with Spring applications应该特别有趣。