1

大規模な Web アプリケーションで Spring 依存性注入を使用します。リクエストまたはセッション データで動作する必要があるサービスがあり、次のjavax.inject.Providerようなインターフェイスを使用して実装しました (コンストラクター注入を使用しますが、この例ではプロバイダーをフィールドに直接注入するため、例は短くなります)。

@Service
public class SomeService()
{
    @Autowired
    public Provider<Data> dataProvider;

    public void doSomething()
    {
        Data data = this.dataProvider().get()

        ...Do something with the request...
    }
}

この例Dataは、セッション スコープのデータです。サービス自体はシングルトンです。

問題は、dataProvider.get()通話がすぎることです。完了するまでに数秒かかります。呼び出しをデバッグしたところ、メソッドのどこかで時間が焼かれていることがわかりましたDefaultListableBeanFactory.getBeanNamesForType。このメソッドでは、すべての Bean 定義名のリストが取得され (これには 1000 を超える名前が含まれています (多数のコントローラー、DAO、およびサービスがあります...))、注入する Bean を見つけるために反復処理されます。

それほど遅い場合、これはほとんど役に立ちません。すでに非常に多くのSpring Beanがあることにショックを受けていますが、検索速度を改善する方法javax.inject.providerや、この種のインジェクションを解決する別の方法はありませんか? Provider.get()メソッドが呼び出されるたびに一致する Bean を検索しないように、Spring が注入できる独自のプロバイダー実装を定義する方法があるのではないでしょうか?

4

2 に答える 2

2

のパフォーマンスDefaultListableBeanFactory.getBeanNamesForTypeが問題として提起され、Spring 3.2 で修正されました。

問題はこちら

3.2 M1 を試して、状況が改善されるかどうかを確認できます。

于 2012-06-08T13:44:22.670 に答える