3

私は彼がこれについて多くのことを読みましたが、それでも私は物事について不明確です. DI とは、実行時に依存コンポーネントに依存関係を注入することを意味します。

Q1

依存関係とは何ですか? これらが実行時に作成されたオブジェクトである場合は?

はいの場合、オブジェクトを作成することによって変数に値を注入していることを意味しますか (フレームワークによって作成されます。つまり、セッター/コンストラクター注入を使用して xml ファイルを介して Bean をインスタンス化します)。

Q2

オブジェクトの介入なしで作業を行うためにDIを行いますか?

4

3 に答える 3

4

Q1

Wikipediaから、DI パターンのすべての要素はオブジェクトです。依存オブジェクトは、インターフェイスを使用して必要なものを指定します。インジェクターオブジェクトは、どの具象クラス (インスタンス化されたオブジェクト) が要件を満たすことができるかを決定し、それらを依存オブジェクトに提供します。

したがって、それは2番目の部分にイエスになります。

Q2

再びウィキペディアから:

依存関係注入パターンの主な目的は、コンパイル時ではなく、実行時に、または構成ファイルを介して、特定の依存関係インターフェイスの複数の実装から選択できるようにすることです。

例として、さまざまな実装のEncoder. 異なるエンコード アルゴリズムには、SHA、MD5 などがあります。セキュリティ サービスは、「エンコード アルゴリズム」のインスタンスが必要であることのみを指定します。Encoder次に、ランタイム DI 環境は、セキュリティ サービスのインターフェイスを提供し、注入するオブジェクトを探します。DI に合わせて、セキュリティ サービスも制御の反転 (IoC)を利用しています。つまり、それ自体がどの実装を使用するかを決定するのではなく、その決定を行うのは DI ランタイムです。

于 2012-08-05T07:57:53.953 に答える
3

簡単にするための精巧な答えではありません。

質問 1:

class Dependent {
  propertyA = new PropertyA();
  propertyB = new PropertyB();
}

ここDependentは と に依存しpropertyApropertyBいます。上記の関係は、依存関係の例です。

これらが実行時に作成されたオブジェクトである場合は? はい。

もし、そうなら....?はい

質問 2: はい。


詳細は以下に含まれています

シナリオ 1:

class Dependent {
  DBConnection connection = new OracleConnection();
}

Dependentクラスは高度に結合されています。コードを変更しない限り、接続を変更する方法がないためです。そのため、顧客が MySQLConnection() を必要とする場合は、コードを変更して別の exe/jar を提供する必要があります。


シナリオ 2:

class Dependent {
  DBConnection connection = ConnectionFactory.createConnection();
}

ConnectionFactoryこれは、いくつかの構成を読み取って必要な を作成できるため、はるかに優れていますconnection

それでも、Dependentクラスをモックするのはいくらか困難になります。これらのシナリオでモックを作成するのは困難です。じゃあ何?


シナリオ 3:

class Dependent {
  DBConnection connection;

  setConnection(DBConnection connection) {
    this.connecttion = connection;
  }
}

class DependencyInjector {
  inject() {
    // wire them together every dependent & their dependency!
    Dependent dependent = indentiyDepenentSomeSmartWay();
    DBConnection connection = indentiyConnectionSomeSmartWay();
    dependent.setConnection(connection);
  }
}

私たちDependencyInjectorのクラスは賢いクラスです。必要な情報をすべて知っています。上記Dependentのクラスはクリーンでシンプルです。単体テスト用にそれらを簡単にモックし、構成を使用して構成できます。

それらのオブジェクトの作成と結合は切り離されています!

于 2012-08-05T07:58:17.833 に答える
1

あなたの質問に簡単な言葉で答えると、

#1の場合: 依存性注入は、必要なオブジェクトを与えることにより、1つのオブジェクトのニーズを満たすことに関するものです。例を見てみましょう:

通常、エンタープライズ アプリケーションでは、サービス内で DAO レイヤーを呼び出し、DAO がすべてのデータベース関連の処理を行うアーキテクチャを使用します。したがって、すべての DAO メソッドを呼び出すには、サービスの必要性と DAO のオブジェクトが必要です。

エンティティ オブジェクトPersonがあるとします。

DAO - PersonDAO があるとしましょう。

public interface PersonDAO {
    void addPerson(Person person);
    void updatePerson(Person person);
    void deletePerson(int personId);
}

およびサービス - PersonService。

public class PersonServiceImpl {
    private PersonDAO personDAO;

    public void addPerson() {
        //some code specific to service.
        //some code to create Person obj.
        personDAO.add(person);
    }
}

ご覧のとおり、PersonService は PersonDAO オブジェクトを使用してそのメソッドを呼び出しています。PersonService は PersonDAO に依存します。したがって、PersonDAO は依存オブジェクトであり、PersonService は依存オブジェクトです。

通常、Spring のようなフレームワークでは、これらの依存関係はフレームワーク自体によって注入されます。アプリケーション コンテキストが読み込まれると、これらすべての依存オブジェクトが作成されてコンテナに配置され、必要に応じて使用されます。制御の反転 (IoC) の概念は、依存関係オブジェクトの作成方法から、依存関係の挿入と非常に密接に関連しています。

たとえば、PersonDAO personDAO = new PersonDAOImpl(); として PersonService 自体に PersonDAO オブジェクトを作成することもできます。

しかし、Spring の場合は、PersonService で PersonDAO のプロパティを定義し、Spring が依存関係を設定するために使用するセッターを提供するだけです。ここで、依存関係の作成は、それを使用しているクラスではなくフレームワークによって処理されるため、制御の反転と呼ばれます。

#2の場合:はい。あなたが正しいです。

于 2013-01-16T12:06:44.270 に答える