猿问

Spring AOP与AspectJ

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

谁能强调在Spring应用程序中使用Spring AOP与AspectJ的利弊?


炎炎设计
浏览 675回答 3
3回答

梦里花落0921

Spring-AOP优点它比AspectJ更易于使用,因为您不必使用LTW(加载时编织)或AspectJ编译器。它使用代理模式和装饰器模式Spring-AOP缺点这是基于代理的AOP,因此基本上您只能使用方法执行联接点。在同一类中调用另一个方法时,不应用方面。运行时可能会有一点开销。Spring-AOP不能为Spring工厂未创建的任何内容添加方面AspectJ专业人士这支持所有联接点。这意味着您可以做任何事情。与Spring AOP相比,运行时开销更少。AspectJ缺点小心。检查您的方面是否仅编织到您想编织的方面。您需要使用AspectJ编译器进行额外的构建过程,或者必须设置LTW(加载时编织)

胡说叔叔

除了别人怎么说-只是另一种方式,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)如果有可用的源,则进行编译时间编织,或者进行后编译编织(使用已编译文件)。此外,可以启用使用Spring进行编织的加载时间-它需要aspectj定义文件并具有灵活性。编译时编织可以提供性能优势(在某些情况下),还可以提供 joinpoint definition in Spring-aop is restricted to method definition only which is not the case for AspectJ.

拉风的咖菲猫

Spring AOP是spring框架的重要组成部分之一。在最基本的阶段,spring框架基于IoC和AOP。在Spring的官方课程中,有一张幻灯片上写着:AOP是框架最重要的部分之一。理解Spring中AOP的工作原理的关键点是,当您使用Spring编写Aspect时,我们会通过为您的对象构建代理来检测框架,JDKDynamicProxy如果您的bean实现了接口,则使用CGLIB;如果您的bean不实现任何接口,则通过CGLIB接口。请记住,如果您使用的是Spring 3.2之前的版本,则必须在类路径中包含cglib 2.2。从Spring 3.2开始,它是没有用的,因为cglib 2.2已包含在核心中。Bean创建时的框架将创建一个代理,该代理包装您的对象并添加跨领域的职责,例如安全性,事务管理,日志记录等。以这种方式创建的代理将从一个切入点表达式开始应用,该切入点表达式将对框架进行检测,以决定将创建哪些bean和方法作为代理。该建议将比您的代码更具责任感。请记住,在此过程中,切入点仅捕获未声明为final的公共方法。现在,在Spring AOP中,方面的编织将在容器启动时由容器执行,而在AspectJ中,您必须通过修改字节码对代码进行后期编译来执行。因此,我认为Spring方法比AspectJ更简单,更易于管理。另一方面,使用Spring AOP不能使用AOP的全部功能,因为实现是通过代理而不是通过修改代码来完成的。与AspectJ中一样,您可以在SpringAOP中使用加载时编织。您可以在使用代理和特殊配置的Spring @EnabledLoadWeaving或XML中受益于此功能。您可以使用名称空间作为示例。但是在Spring AOP中,您无法截获所有情况。例如,newSpring AOP不支持该命令。但是,在Spring AOP中,可以通过aspectof在spring配置bean中使用factory方法来受益于AspectJ的使用。由于Spring AOP本质上是从容器创建的代理,因此您只能将AOP用于spring bean。使用AspectJ时,您可以在所有bean中使用该方面。另一个比较点是调试和代码行为的可预测性。使用spring AOP,这项工作全部由Java编译器执行,而方面是为Spring bean创建代理的一种非常酷的方法。在AspectJ中,如果您修改代码,则需要进行更多的编译,并且难以理解将方面编织在何处。即使在春季关闭织造也很简单:在春季,您从配置中删除了方面,然后重新启动就可以了。在AspectJ中,您必须重新编译代码!在加载时编织中,AspectJ比Spring更灵活,因为Spring不支持AspectJ的所有选项。但是在我看来,如果您想更改Bean的创建过程,更好的方法是在工厂中管理自定义登录,而不是通过加载时编织方式来改变新操作员的行为。我希望AspectJ和Spring AOP的全景视图可以帮助您了解两种药水的区别
随时随地看视频慕课网APP
我要回答