6

@AspectJスタイル アノテーションと<aop:aspectj-autoproxy/> . トランザクション、監査、プロファイリングなどに使用します。コードが追加されるにつれてアプリケーションの起動時間が継続的に増加することを除けば、問題なく動作します。

いくつかのプロファイリングを行ったところ、Spring コンテナーの初期化中にほとんどの時間が費やされていることがわかりました。具体的にorg.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(String, ObjectFactory)は、約 35 秒かかります。 org.springframework.aop.support.AopUtils.canApply(Pointcut, Class, boolean)- 約15秒かかります。

私の目標は、現在のように約 45 秒ではなく、5 ~ 10 秒でアプリケーションを開始することです。そのため、ヒントをいただければ幸いです。

4

6 に答える 6

5

あなたが投稿したものから、システムがロードされているときにすべてのクラスをウィービングする必要があるため、起動ペナルティが発生するロードタイムウィービングを使用しているように見えます。主な関心事が起動時間である場合は、コンパイル時ウィービングに切り替えることをお勧めします。これを行う方法の説明は、Springのドキュメント(第6章、セクション8)またはAspectJサイト(http://www.eclipse.org/aspectj/docs.php)にあります。

AspectJコンパイラを使用したコンパイル時ウィービングへの切り替えは比較的順調です。

  1. <aop:aspectj-autoproxy/>コンテキストファイルから表記を 削除し ます。
  2. ビルドファイルにaspectJコンパイルステップを追加します。AspectJサイトでは、antプラグインを見つけることができるはずです。codehausにはmavenプラグインがあります。これが私たち両方の方法の例です。

Mavenの場合:

<plugin>
     <groupId>org.codehaus.mojo</groupId>
     <artifactId>aspectj-maven-plugin</artifactId>
     <version>1.3</version>
     <configuration>
     <verbose>true</verbose>
      <source>1.6</source>
      <target>1.6</target>
      <complianceLevel>1.6</complianceLevel>
      <showWeaveInfo>true</showWeaveInfo>
      <aspectLibraries>
        <aspectLibrary>
                                <groupId>org.springframework</groupId>
                                <artifactId>spring-aspects</artifactId>
                            </aspectLibrary>
                        </aspectLibraries>
                    </configuration>
                    <executions>
                        <execution>
                            <goals>
                                <goal>compile</goal>   
                            </goals>
                        </execution>
                    </executions>
                </plugin>

Antの場合

 <taskdef
            resource="org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties">
            <classpath>
                <pathelement location="${lib.dir}/AspectJ_1.6.8/aspectjtools.jar"/>
            </classpath>
        </taskdef>

  <iajc aspectPath="${file.reference.spring-aspects.jar}; ${build.classes.dir}/path/to/custom/aspects"
              classpath="${lib.dir}/AspectJ_1.6.8/aspectjrt.jar; ${javac.classpath}"
              inpath="${build.classes.dir}"
              destDir="${build.classes.dir}"
              showWeaveInfo="true" />
于 2011-01-19T17:01:30.737 に答える
3

非シングルトン Bean が多数ある場合、これは明らかに既知の問題です。Spring 3.1 の修正があるようです: https://jira.springsource.org/browse/SPR-7328

于 2011-01-14T12:26:24.883 に答える
1

循環依存関係はありますか? それが私の現在のアプリを殺しているものです。

それが実際の解決策ではないことはわかっていますが、コンテキストを分割して、異なる VM で異なるサービスを SOA スタイルで実行します。これにより、すべてのアプリの起動時間が短くなり、これらのサービスの実装をより簡単に変更したり、テストするコードの量が少なくなったりする柔軟性が得られるはずです。

私のアプリの 1 つでそれをしなかったのですが、今では起動時間が約 3/4 分です。その問題は解消されず、悪化するだけですが、遅すぎると、アプリが大きくなりすぎて、分割するのが難しくなります.

私が調べるもう1つのことは、休止状態です。セッションファクトリの作成はかなり遅くなる可能性があります。

于 2011-01-18T03:00:13.677 に答える
1

あなたの状況に当てはまるかどうかはわかりませんが、CachingBeanFactory を使用することで Spring のパフォーマンスを向上させることができます

これは通常、Bean をワイヤリングするときに適用されますが、アスペクトの適用方法とワイヤリング方法によっては、改善がもたらされる場合があります。

于 2011-01-14T12:25:18.753 に答える
0

jdk1.7をjdk1.6に戻す前に、同じ問題がありました。jdk1.7 までに、私のアプリは「Spring ルート WebApplicationContext の初期化」で 30 秒以上ハングします。元に戻すと、10秒で起動します。

于 2012-12-19T08:49:50.140 に答える