Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用AspectJ的Spring AOP:加载时编织_Spring_Aop_Aspectj_Load Time Weaving - Fatal编程技术网

使用AspectJ的Spring AOP:加载时编织

使用AspectJ的Spring AOP:加载时编织,spring,aop,aspectj,load-time-weaving,Spring,Aop,Aspectj,Load Time Weaving,如果我使用的是基于AspectJ的SpringAOP,那么我是否需要将方面配置为使用加载时编织?或者,当使用基于AspectJ的方法时,SpringAOP是否也支持运行时/编译时编织?SpringAOP是基于代理的。除非配置为其他方式,否则SpringAOP将执行运行时编织 编织:将方面与其他应用程序类型或对象链接到 创建一个建议对象。这可以在编译时完成(使用 例如,AspectJ编译器),加载时或运行时。春季AOP, 与其他纯JavaAOP框架一样,它在运行时执行编织 资料来源: 不过,您可

如果我使用的是基于AspectJ的SpringAOP,那么我是否需要将方面配置为使用加载时编织?或者,当使用基于AspectJ的方法时,SpringAOP是否也支持运行时/编译时编织?

SpringAOP是基于代理的。除非配置为其他方式,否则SpringAOP将执行运行时编织

编织:将方面与其他应用程序类型或对象链接到 创建一个建议对象。这可以在编译时完成(使用 例如,AspectJ编译器),加载时或运行时。春季AOP, 与其他纯JavaAOP框架一样,它在运行时执行编织

资料来源:


不过,您可以设置Spring来执行加载时编织。查看Spring文档,了解如何执行此操作:

除此之外,您可以在Java配置类中使用
@EnableLoadTimeWeaving
。 设置相当简单,您的
@Aspect
类不会更改

开发人员只需修改构成应用程序的一个或多个文件 上下文来启用加载时编织,而不是依赖 通常负责部署的管理员 配置,例如启动脚本


我认为我们应该小心不要混淆SpringAOP和AspectJ

  • 正如singh101所说,SpringAOP是基于代理的,更确切地说是基于JavaSE动态代理(用于接口)或CGLIB代理(用于类)。它使用AspectJ语法的一个子集,是一种“AOP lite”方法,基本上局限于方法执行切入点,缺少许多AspectJ切入点类型,如方法调用、类成员集/获取、构造函数调用/执行等。从技术上讲,它与AspectJ有很大的不同,并且由于代理方法(调用间接寻址)的缘故,总是会产生运行时开销。此外,它仅限于从Bean类外部调用Springbean方法,也就是说,如果Bean调用自己的一个方法(因为它不经过相应的代理),它就不起作用,并且它也不适用于非Springbean类(普通POJO)
  • 另一方面,AspectJ是一个成熟的AOP框架,它不依赖于代理或Spring框架。不过,它可以很容易地包含在Spring应用程序中。它的工作原理是通过自己的编译器(Java编译器的超集)直接生成字节码,或者检测现有的字节码。AspectJ可以在编译时(无运行时开销)或类加载(加载时编织,LTW)期间使用。虽然LTW在应用程序启动期间有一点开销(但Spring AOP也有同样的开销),但两种AspectJ编织方法都没有运行时开销,这是由于调用间接寻址,因为不涉及代理
  • 关于AOP的Spring手册一章很好地解释了Spring AOP功能不够强大或太慢的原因

太好了,谢谢。让我看看我是否明白;因此,听起来SpringAOP和aspectj默认情况下将使用运行时编织,但如果需要,可以配置为使用加载时?@Angad,运行时编织和加载时编织是否可能同时存在?我们可以同时使用这两种吗?例如,我们有一个旧的应用程序,它使用了很多bean,并使用
Spring AOP
core context.xml
文件,但现在我们需要添加一个不依赖
bean
方面。因此,我们制作
aop.xml
并使用
AspectJ
加载时编织
如何确保新的方面和
编织
不会损坏旧的
方面
?在这本书中,我看到我们可以同时使用这两种语言:我不是Spring用户。但我认为,如果做得好,你可以将两者结合起来。我没有读过你链接到的那本书,但如果作者说怎么做,我看不出有什么理由不起作用。我认为很重要的一点是,纯AspectJ方面和它们所针对的bean不会被提取两次(例如,一次通过Spring组件扫描,一次通过LTW)。配置干净,这应该不是问题。祝你好运