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

时间:2014-10-12 13:39:52

标签: spring aop aspectj load-time-weaving

如果我使用基于AspectJ的Spring AOP,那么我是否可以配置我的方面以使用加载时间编织?或者,当使用基于AspectJ的方法时,Spring AOP是否也支持运行时/编译时编织?

2 个答案:

答案 0 :(得分:15)

我认为我们应该注意不要混淆Spring AOP和AspectJ。

  • 与singh101一样,Spring AOP是基于代理的,更准确地基于Java SE动态代理(用于接口)或CGLIB代理(用于类)。它使用AspectJ语法的一个子集,是一种“AOP lite”方法,基本上仅限于方法执行切入点,缺少许多AspectJ切入点类型,如方法调用,类成员set / get,构造函数调用/执行等。从技术上讲,它与AspectJ非常不同,并且由于代理方法(调用间接)而总是会产生运行时开销。此外,它仅限于从bean类外部调用Spring Bean方法,即如果bean调用其自己的方法之一(因为它不通过相应的代理),它不起作用,并且它也不适用于非类-Spring Bean类(普通POJO)。
  • 另一方面,AspectJ是一个完整的AOP框架,它不依赖于代理或Spring框架。但是,它可以很容易地包含在Spring应用程序中。它的工作原理是直接通过自己的编译器(它是Java编译器的超集)生成字节代码,或者使用现有的字节代码。可以在编译期间(没有运行时开销)或在类加载(加载时间编织,LTW)期间使用AspectJ。虽然LTW在应用程序启动期间有一点开销(但同样适用于Spring AOP),但两种AspectJ编织方法都没有由于调用间接而导致的运行时开销,因为没有涉及代理。
  • 当Spring AOP不够强大或太慢时,关于AOP的Spring手册章很好地解释了how to integrate full AspectJ into Spring

答案 1 :(得分:8)

Spring AOP是基于代理的。除非另有配置,否则Spring AOP会执行运行时编织。

  

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

来源:http://docs.spring.io/spring/docs/4.0.1.RELEASE/spring-framework-reference/htmlsingle/#aop-introduction-defn


但是,您可以设置Spring来进行加载时编织。查看Spring文档,了解如何执行此操作: http://docs.spring.io/spring/docs/3.2.0.RELEASE/spring-framework-reference/htmlsingle/#aop-aj-ltw

除此之外,您将在Java Config类中使用@EnableLoadTimeWeaving。 设置非常简单,您的@Aspect类不会更改。

  

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