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配置你獲得的抽象性和便利性的措施,另一面是,春天需要做大量的工作類加載過程中產生動態代理和編織類。這在啓動時總會有開銷。

然而,服務器啓動時間很少是關鍵因素,因此您傾向於在幾天內測量正常運行時間,所以在我看來,一分鐘左右或更慢的啓動對於所有便利性來說都是公平交易,儘管它可能會出於調試目的而煩人。

如果您向服務器啓動中添加一些進程以運行應用程序,則可以減輕首次加載的開銷。這有助於確保服務器已啓動,因此您的第一個真正請求不會受到影響。

如果您必須更快啓動或發現開銷不可接受,則可以考慮使用編譯時編織來實現切入點。使用這種方法,繁重的工作都是在編譯時完成的,所以類可以在相當的時間內加載到非織造版本(取決於編織當然是什麼)。