使用编译时编织的Spring @Configurable的启动性能

这是关于堆栈溢出的第一个问题,所以请善待。 我正在运行一个应用程序 春天2.5.x 可配置的注释 编译时间编织(CTW) 行家 蚀/ AJDT 我使用CTW,一切运行正常。但是,如果我第一次实例化一个带注释的类,则需要很长时间。第二次非常快。 查看第一次调用的探查器堆栈跟踪,我看到93%的时间被使用 org.aspectj.weaver.internal.tools.PointcutExpressionImpl.matchesMethodExecution(方法) 在第二次调用的堆栈跟踪中,此方法仅使用1%的时间。更糟糕的是:第一次通话大约需要第二次通话的10倍。 我想知道,因为我认为CTW不再需要织布工。 但是,只要有人在这个类上调用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>
    
已邀请:
使用Spring的aop配置可以获得抽象和便利的标准,另一方面,Spring需要在类加载期间做很多工作来生成动态代理并编织类。这在启动时总是有开销。 然而,服务器启动时间很少是一个关键因素,你倾向于测量几天内的正常运行时间,因此在我看来,一分钟左右的启动速度是一个公平交易的所有便利,尽管它可能会令调试失败。 如果向服务器启动添加一些进程以运行应用程序,则可以稍微减轻首次加载的开销。这有助于确保服务器已准备好,因此您的第一个真实请求不会受到影响。 如果您必须更快地启动或发现不可接受的开销,您可以考虑使用编译时编织来实现切入点。通过这种方法,繁重的工作都是在编译时完成的,因此类的加载时间与无纺布版本相当(取决于编织当然的情况)。     
当我分析堆栈跟踪时,我自己找到了答案。 除了@Configurable with CTW,我还用于事务管理。当我第一次加载带有@Configurable注释的原型bean时,spring bean factory会检查我们的aop:advices是否匹配。因此它使用了一个aspectj库。 所以我原来的问题有点误导。我们在@Configurable中使用CTW,但同时使用LTW进行事务和安全管理。然后必须在加载时再次编织在编译时编织的bean。 我现在将寻找一种避免LTW的方法,因为启动时间对我们的开发过程至关重要。 感谢您的意见和解答。当他们把我推向正确的方向时,他们很有帮助。     

要回复问题请先登录注册