3 回答
TA贡献1772条经验 获得超6个赞
Spring-AOP优点
它比AspectJ更易于使用,因为您不必使用LTW(加载时编织)或AspectJ编译器。
它使用代理模式和装饰器模式
Spring-AOP缺点
这是基于代理的AOP,因此基本上您只能使用方法执行联接点。
在同一类中调用另一个方法时,不应用方面。
运行时可能会有一点开销。
Spring-AOP不能为Spring工厂未创建的任何内容添加方面
AspectJ专业人士
这支持所有联接点。这意味着您可以做任何事情。
与Spring AOP相比,运行时开销更少。
AspectJ缺点
小心。检查您的方面是否仅编织到您想编织的方面。
您需要使用AspectJ编译器进行额外的构建过程,或者必须设置LTW(加载时编织)
TA贡献1804条经验 获得超8个赞
除了别人怎么说-只是另一种方式,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.
TA贡献1995条经验 获得超2个赞
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的全景视图可以帮助您了解两种药水的区别
添加回答
举报