重複の可能性:
依存性注入はどの程度正確に結合を減らしますか?
概念としての依存性注入は、緩い結合をカプセル化していると思います。緩い結合を達成するのに役立つと言うのは正しいですか?私が理解していることから、緩い結合を持つクラスを設計した場合は、そのクラスにDIを実装できます。私が間違っている場合は、私を理解して修正するのを手伝ってください。
重複の可能性:
依存性注入はどの程度正確に結合を減らしますか?
概念としての依存性注入は、緩い結合をカプセル化していると思います。緩い結合を達成するのに役立つと言うのは正しいですか?私が理解していることから、緩い結合を持つクラスを設計した場合は、そのクラスにDIを実装できます。私が間違っている場合は、私を理解して修正するのを手伝ってください。
疎結合は本質的に DI とは何の関係もないと思います。必要に応じて、完全に密結合しているプロジェクトで DI を使用できます。
疎結合とは、あるコンポーネントを別のコンポーネントの実装の詳細から分離することです。これは通常、具体的なクラスではなく、インターフェースのインスタンスとしてコラボレーターを提供することにより、Java で実現されます。
私が言いたいのは、DI は多くの状況で人々を疎結合コードに導く傾向があるということですが、それを強制するものではありません (ただし、Spring のような一部の製品では、インターフェイスを使用しないことには多くの欠点があります)。コンテナーは、疎結合された共同作業者の配線もサポートしています。この例は、密結合されている間、DI コンテナーで完全に問題ありません。
public class FooService { ... }
public class SomeOtherService {
public SomeOtherService(FooService fooService) {
this.fooService = fooService;
}
}
ただし、「SomeOtherService」がインターフェイスに関連付けられているため、これは疎結合です。
public interface FooService { ... }
public class SomeOtherService {
public SomeOtherService(FooService fooService) {
this.fooService = fooService;
}
}
好みの配線メカニズム (guice、Spring 注釈、Spring xml、Java CDI) を挿入しますが、概念は同じです。
ウィキペディアには、疎結合に関する優れた記事があります。
@maba が提案したように、このサイトには多くの関連資料があります。
とにかく:はい、あなたは正しいです。いつでも独自に DI を実装できますが、一般的には複雑すぎるタスクです。シンプルに保ちたい場合は、「依存関係を運ぶ」問題やその他多くの問題に遭遇するためです。
Guice、Spring、Pico を簡単に見てみましょう ;-) これらはすべて十分にテストされ、完全に機能します。幸運を。
はい、DI は疎結合を実現するのに役立ちます。これは、コンポーネントまたはサービスのオブジェクトが必要な場所ならどこでも、そのスーパー インターフェイスのタイプによって自動配線できるためです。アプリケーションコンテキストファイルで指定するクラスのタイプ、または @Component、@Service、または @Reposirory で注釈を付けるクラスに応じて、注入される実際のオブジェクトのタイプは実行時に決定されます。