大規模な 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 が注入できる独自のプロバイダー実装を定義する方法があるのではないでしょうか?