0

高性能でなければならないコードのセクションで、管理されていないSpringインスタンスに@Configurable Beanを使用しています。私たちは new オペレーターで多くの管理されていない Bean を使用しており、プロファイリングでは、 @Configurable アノテーションの使用がかなり遅くなっていることに気付きました。

この特定のセクションのためだけに、コンテキストから Bean を取得するより高速な方法 (直接の applicationContext.getBean() のみ) が必要です。これを行うために IoC を放棄することはわかっていますが、これは特別なシナリオであり、通常のパターンではありません。

ウィービングにはCTWを使用していますが、アプリケーションコンテキストを取得するために舞台裏でSpringが使用しているメカニズムを知りたかったので、簡単に取得してgetBeanを使用できますか? 静的アプリケーション コンテキスト? スレッドローカルのどこかに保存されていますか?

4

1 に答える 1

1

アスペクトは、AspectJ によって管理されるシングルトンです。Spring 構成ファイルにアスペクトを配置しても、Spring は実際にはアスペクトを作成しません。代わりに、 を使用してアスペクトへの参照を取得しaspectOf()ます。

これは、(ウィービングを行うコンパイル時に) @Configurable アノテーションが singleton にフックされることを意味しますAnnotationBeanConfigurerAspect。次に、アプリケーション コンテキストをロードすると、Spring は同じシングルトン アスペクトへの参照を取得setBeanFactory()し、アスペクトのメソッドを呼び出します (実装しているためBeanFactoryAware)。

もちろん、この魔法はトラブルにつながる可能性があります。2 つのアプリケーション コンテキストがある場合、2 番目が最初の設定を上書きしてしまい、非常に混乱する可能性があります。

質問に直接答えるには、実装する新しいアスペクトを作成し(例として使用できるAnnotationBeanConfigurerAspectBeanFactoryAwareのコードを次に示します)、Spring 構成ファイルで同じアスペクトを「インスタンス化」するだけでよいことを意味します。これで、アスペクトは Bean ファクトリにアクセスできるようになります。

BeanFactoryパフォーマンスを重視する場合は、アプリケーションの起動時に への静的参照を作成してインスタンス化するよりも上記の方法の方がきれいではないことに注意してください。

于 2013-03-29T13:52:41.597 に答える