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