2

这是我关于堆栈溢出的第一个问题,所以请客气。Spring @Configurable使用编译时织入的启动性能

我运行一个应用程序与

  • 弹簧2.5.X
  • 配置注解
  • 编译时织入(CTW)
  • 行家
  • 蚀/ AJDT

我使用CTW,一切运行良好。但是,如果我第一次实例化一个带注释的类,它需要很长时间。第二次非常快。

综观探查堆栈跟踪针对第一呼叫我看到的时间93%是使用 org.aspectj.weaver.internal.tools.PointcutExpressionImpl.matchesMethodExecution(方法)

在堆栈跟踪第二次调用只有1%的时间用于此方法。更糟糕的是:第一次通话大约需要第二次通话的10倍。

我在想,因为我认为CTW不再需要织布工。

但是,Spring似乎只在有人在这个类上调用new时就开始分析原型bean。它使用aspectj weaver来分析需要完成的工作,并准备好加速下一次调用的过程。

有没有人有加速第一次调用初始化注释类的经验?

这是我的POM的一个片段:

<plugin> 
<groupId>org.codehaus.mojo</groupId> 
<artifactId>aspectj-maven-plugin</artifactId> 
<executions> 
    <execution> 
     <goals> 
     <goal>test-compile</goal> 
     <goal>compile</goal> 
     </goals> 
</execution> 
</executions> 
<dependencies> 
    <dependency> 
    <groupId>org.aspectj</groupId> 
    <artifactId>aspectjtools</artifactId> 
    <version>1.6.1</version> 
    </dependency> 
</dependencies> 
<configuration> 
<verbose>true</verbose> 
<complianceLevel>1.5</complianceLevel> 
<source>1.5</source> 
<showWeaveInfo>true</showWeaveInfo> 
<outxml>true</outxml> 
<aspectLibraries> 
    <aspectLibrary> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-aspects</artifactId> 
    </aspectLibrary> 
</aspectLibraries> 
</configuration> 
</plugin> 
+0

我认为这是CTW所固有的。第一次调用必须完成所有繁重的工作,才能分析,编织和生成运行时类,而且它非常昂贵。 – skaffman 2009-07-16 10:14:59

回答

0

我在分析堆栈跟踪时发现了我自己的答案。

除了@Configurable与CTW我用于交易管理。当我用@Configurable注解的原型bean第一次加载时,spring bean factory会检查我们的aop:advices是否匹配。因此它使用了一个aspectj库。

所以我原来的问题有点误导。我们为@Configurable使用CTW,但同时使用LTW进行事务和安全管理。在编译时编织的bean必须在加载时再次编织。

我现在将寻找一种方法来避免LTW,因为启动时间对我们的开发过程至关重要。

感谢您的意见和解答。他们是有帮助的,因为他们把我推向了正确的方向。

2

与Spring AOP配置你获得的抽象性和便利性的措施,另一面是,春天需要做大量的工作类加载过程中产生动态代理和编织类。这在启动时总会有开销。

然而,服务器启动时间很少是关键因素,因此您倾向于在几天内测量正常运行时间,所以在我看来,一分钟左右或更慢的启动对于所有便利性来说都是公平交易,尽管它可能会出于调试目的而烦人。

如果您向服务器启动中添加一些进程以运行应用程序,则可以减轻首次加载的开销。这有助于确保服务器已启动,因此您的第一个真正请求不会受到影响。

如果您必须更快启动或发现开销不可接受,则可以考虑使用编译时编织来实现切入点。使用这种方法,繁重的工作都是在编译时完成的,所以类可以在相当的时间内加载到非织造版本(取决于编织当然是什么)。