2012-02-04 7 views
8

私が本当に欲しいものを説明するのは難しいです。私はクラスの変数のすべてのランタイムデバッグ情報を提供するメソッドgetRuntimeInfo()を持つインターフェイスを持っています。私はこのインターフェイスを実装するすべてのクラスのリストを見たいと思います。私はJavaとSpringを使用しています。 これを行うには、Spring ContextからすべてのBeanを取得し、instanceof演算子を使用してチェックする方法があります。しかし、明らかなパフォーマンスへの影響を避けるためには、そうしたくはありません。他の選択肢がありますか?特定のインターフェイスを実装するすべてのクラスを追跡しますか?

答えて

13

何:

@Component 
public class WithAllMyInterfaceImpls { 

    @Autowire 
    List<MyInterface> allBeansThatImplementTheMyInterface; 

} 

一覧はのみ()起動時に一度読み込まれるので、「通常の」実行時のパフォーマンスに大きな影響を与えるべきではありません。


コメント:

あなたのコード

を説明することができますが、春はIOCコンテナである知っています。 @Componentは、このクラスのインスタンスを作成する必要があることをSpringに通知します(いわゆるSpring Managed Bean)。 IOCは、コンテナが他のインスタンス(Spring Managed Bean)への参照を挿入する責任があることも意味します。 (そして@Resource@Injectも同様です)は、SpringにこのフィールドがSpringによって読み込まれるように指示するような注釈です。 Spring自体は、フィールドにどのインスタンスを設定するかを把握しようとします。 Springが使用するデフォルトのテクニックはby typeです。これは、Springがフィールドの型を検査し、一致するBeanを検索することを意味します。あなたの場合、それは一般的なリストです - これはちょっと特殊です。この場合、Springはフィールドをリストで埋め込みます。ここで、要素はジェネリック型と一致するすべてのBeanです。

+0

これは通常の春のオートワイヤリング機能ですが、特別なことは何もありません。それはちょうど中心の春の機能です – Ralph

+0

@ user1117398:私はそれを少し説明するために私の答えを拡張しました。 - あなたはSpring 3.0を読むべきですね! 3.1チュートリアルを参照してください。 – Ralph

関連する問題