2012-03-16 17 views
1

私はPro Spring 2.5の本を読んでいます。依存性注入がどのように機能するのかという質問があります。依存性注入はどのように機能していますか?

私はBeanFactoryについて理解しており、依存関係の参照を行っています。今私は依存性注入について読んで、いくつか質問があります。私が理解していることに基づいて、アプリケーションを起動するためのオブジェクトをルックアップするなど、ルックアップを最小限に抑えたいと思っています。それから、依存性注入が残りを処理します。しかし、私はこの作品を理解していない。

あなたはbeanfactoryを持っているとしましょう、アプリケーション全体を開始するMyApplicationインスタンスを取得します。残りのオブジェクトは、依存関係注入を使用して共同作業者を取得します。 Beanfactoryは管理しているBeanのリストを保持していますが、このファクトリはアプリケーションのメインメソッドでのみ使用できますか?そして、もしその豆乳がその豆を含んでいる範囲を管理していれば、それはどうやって行われたのか分かりません。何らかの形で世界的に豊かなのか?

答えて

2

Beanファクトリは、すべてのオブジェクトをインスタンス化します。設定(xmlまたは注釈)を解析し、Beanをインスタンス化し、依存関係を設定します。これらのすべてのBeanはアプリケーションコンテキストに格納されます。

通常、アプリケーションへのエントリポイントがあります。そこにはcontext.getBean(..)があります。これで、BeanはBeanファクトリによってコンテキストに置かれるため、依存関係が注入されました。

DI枠組みの使用時にnew演算子(Beanクラスを使用)を使用することは決してありません。フレームワークはインスタンスではなく、あなたを作成します。

+0

これで、アプリケーションを「起動」するBeanには、依存関係が注入されて使用可能なBeanを取得できるレジスタが追加されました。 – LuckyLuke

+0

はい。 Webコンテキストでは、たとえば、コンテキスト(レジストリ)がリスナーによって開始されます。これは春から提供され、表示されません。 – Bozho

2

このように、2つの方法があります(Spring 3の場合)。 "伝統的な"依存性注入では、Beanファクトリはそれ自身が作成するBeanにのみ依存性を注入できます。このシナリオでは、Beanファクトリは、そのBeanが最初に作成されるときにBeanのすべての依存関係を解決して注入します。

他の方法では、「完全な」AspectJをロードまたはコンパイル時の織りで使用する必要があります。このシナリオでは、基本的にすべてのnew操作をポイントカットするaspectをspring-aspects.jarで使用し、任意に作成されたオブジェクトへの依存性注入を可能にします。これは、@Configurable注釈を使用することによってトリガーされます。あなたはもっと読むことができますhere

0

制御と依存性注入の逆転の全体的なポイントは、あなたが(通常)はアプリケーションを開始する以外は beanfactoryを必要としないということです。依存関係がオブジェクトに「自動的に表示されます」。これは、基本的に、アプリケーションの存続期間中に非常に少ない、通常は1つのインスタンスを持つオブジェクトを対象としています。

など。 MyApplicationがMyModuleAのインスタンスに依存している場合は、単に@Autowiredにすることができます。開始時にbeanfactoryからアプリケーションオブジェクトをフェッチすると、既にMyModuleAのインスタンスがプリセットされています。

スコープについて:これはウェブのコンテキストに由来します。 1つのインスタンスしか持たないオブジェクトのほかに、オブジェクトをユーザーのセッションにスコープすることができます。そこにいくつかの要求を守って、別のユーザーに分かれている必要がある情報を保管することができます。

通常、Beanファクトリをグローバルとして扱います。私はいくつかのインスタンスを持つことは可能だと思いますが、それらは切断され、他のインスタンスにしか知られていないオブジェクトを挿入することはできません。