20

こんにちは、私は String の初心者で、Martin Fowler の記事を読んでいます: http://martinfowler.com/articles/injection.html

彼は、映画を見つけるために MovieFinder を使用する MovieLister の例を挙げました。この例では、彼は最初にコードを提供しました。

class MovieLister...
    private MovieFinder finder;
    public MovieLister() {
        finder = new ColonDelimitedMovieFinder("movies1.txt");
    }
}

彼は、友人が同じ MovieFinder 実装を使用し、ムービーを同じ txt ファイルに入れていない限り、MovieLister を再利用するために友人に渡すことはできないと指摘しました。

はい、もちろん、これは誰かが再利用できることを期待してコンポーネントを作成する方法ではありません。代わりに、彼が進行するにつれて、次のように書く必要があります。

class MovieLister...
    public MovieLister(MovieFinder finder) {
        this.finder = finder;       
    }
}

はい、そのほうがいいです。これで、友人が MovieLister を引き継いで、自分のコードをプラグインできるようになります。私にとって、物語は完結しています。依存関係を注入するために Spring フレームワークが必要な理由がわかりません。依存関係は、友人のコードによって MovieLister に注入されます。完全停止。すべての Spring セットアップは、単純に MovieFinder インターフェースを実装してそのような呼び出しを行うことと同等です。

MovieFinder myMovieFinder = new MyMovieFinderImpl();
MovieLister myMovieLister = new MovieLister(myMovieFinder);

シンプル、簡単。コードで MyMovieFinderImpl インスタンスの作成をハードコーディングしていることは知っています。しかし、これを XML に移行したのに、他の多くのものを持ち込むことに何の意味があるのでしょうか? いつからプログラマーはコードをコンパイルするのが怖くなり、すべてを完了するためにコンパイルせずに XML を変更することを好むようになったのでしょうか? 申し訳ありませんが、私は要点を見逃していると思います。すべてのプログラムは、何十年も前に依存性注入を使用しています。しかし、昔は、ライブラリ、DOS コマンド ライン、または GUI を使用して、プログラムによって依存関係が注入されていました。なぜ今、依存性を注入するためにさらに別の方法が必要なのでしょうか?

ありがとうございました。

更新しました:

さて、皆さんの多くが注釈を持ち出しました。Spring についての私の浅薄な理解では、注釈よりも XML を使用する方が快適に感じるかもしれません。少なくとも、より簡単に理解できるように、依存関係がどのようになっているのかを一覧表示する中心的な場所があります。注釈があれば、そのような中心的な場所はありません。代わりに、魔法が起こっているだけです。パラメータとして何が渡されるか知りたいですか? 自分でそれを理解し、頑張ってください。はい、コードのナビゲートに役立つスマート IDE プラグインがあることは知っています。しかし、そもそもあることを複雑にして、生活を楽にする別のことを祝うのはなぜでしょうか? 注釈によってコードの閲覧や理解が難しくなるため、人々がそのために IDE プラグインを作成するという事実は、そもそも不必要なものを作成する可能性があることは明らかですよね?

4

3 に答える 3

9

「昔」のコードは最初の例のように書かれていました。

Springライブラリです。これは、「昔」に行われた方法の 1 つだとおっしゃっています。

コマンド ラインや GUI で実装を指定することはめったにありませんでした。(a) システムが今日ほど複雑になることはめったになく、(b) 現在のように他のシステムと相互運用する必要がなく、(c) 深いテストが実装される頻度ははるかに低くなりました。

「その他いろいろ」とは?春は分離されています。必要なものだけを持ち込めます。

注釈による構成を無視したのはなぜですか?

目的は、一般的でローカライズされた既知の標準メカニズムを使用することです。「何十年も前に、すべてのプログラムが依存性注入を使用していた」と言うのはばかげています。私は何十年も前に、非常に幅広い言語でプログラミングを行いました。同様のことを行っていましたが、それぞれ独自の実装を行っており、洗練度のレベルも成功のレベルもさまざまでした。

DI/IoCにSpringは必要?いいえ、他の多くの DI フレームワークがこれを証明しています。それはよく知られた、本質的に標準的な方法ですか?うん。

于 2012-12-16T00:01:28.260 に答える
7

原則 (DI) と1 つの実装 (Spring)を混同しないでください。

DI は好きだけど自分のコードで接続したい場合: Google Guice を使用してください。

DI が好きだが、コードオプションで XML の中でワイヤリングを行うことを好む場合は、(Java EE のトラックから) CDI を使用してください。

DI と XML が好きな場合 (または、再構成してアプリケーションの動作を変更する必要がある場合) は、Spring を使用してください。

DI が気に入らない場合は、別の質問をしてください。

同じ原則を複数実装するのは良いことです。

于 2012-12-16T00:01:14.060 に答える
2

はい、クラスが 2 つしかない場合は、「依存性注入」を手動で行う方が簡単です。しかし、多くのクラスがある場合、フレームワーク (Spring など) が正しい初期化と注入の順序を見つけてくれると、より簡単で柔軟になります。

ところで、最近の Spring バージョンでは、XML を (あまり) いじる必要はありません。注釈を使用して依存関係を宣言できます。

于 2012-12-16T00:06:29.610 に答える