依存性注入(DI: Dependency Injection)

依存性注入(DI: Dependency Injection)は、オブジェクト指向プログラミングにおける高度な設計手法の一つであり、クラス間の依存関係を外部から注入することにより、疎結合(loose coupling)を実現する技術です。これにより、コードの再利用性、テストの容易さ、保守性が大幅に向上します。


基本概念

通常、あるクラスが他のクラスのインスタンスを自ら生成する場合、そのクラスは依存先の実装に強く結びついてしまい(密結合)、変更やテストが難しくなります。
依存性注入では、依存オブジェクトの生成と管理を外部に委ね、必要な依存オブジェクトを注入(渡す)ことで、柔軟で拡張可能な構造を作ります。


用語の定義

  • 依存関係(Dependency):クラスが利用する外部のコンポーネントやサービス。

  • 注入(Injection):依存関係を外部から渡す操作。

  • DIコンテナ:依存関係を管理・注入するフレームワークやライブラリ。


依存性注入の種類

  1. コンストラクタインジェクション

    • 依存オブジェクトをコンストラクタの引数として渡す。

    java
    class Service { private final Repository repository; public Service(Repository repository) { this.repository = repository; } }
  2. セッターインジェクション

    • セッターメソッドで依存オブジェクトを渡す。

    java
    class Service { private Repository repository; public void setRepository(Repository repository) { this.repository = repository; } }
  3. インターフェースインジェクション

    • インターフェースを通じて依存関係を注入する(あまり一般的ではない)。

    java
    interface Injectable { void inject(Dependency dep); }

依存性注入のメリット

  • 疎結合の実現:依存先の実装に依存しないため、変更に強い設計が可能。

  • テスト容易性:モックやスタブを用いて簡単にユニットテストが可能。

  • 拡張性:新しい実装に切り替える際、クラス本体の修正が不要。

  • 再利用性向上:依存を注入することで、汎用的なクラス設計ができる。


実際の使用例(Java + Spring Framework)

java
@Component class MyService { private final MyRepository repository; @Autowired public MyService(MyRepository repository) { this.repository = repository; } }

SpringがDIコンテナとして働き、MyRepositoryのインスタンスを自動的に注入します。


まとめ

項目 説明
主目的 クラス間の依存関係を外部から注入し、疎結合にする
実装手段 コンストラクタ、セッター、インターフェース
使用される技術 DIコンテナ(Spring, Guice, Daggerなど)
利点 保守性・テスト性・拡張性・再利用性の向上

依存性注入は、SOLID原則の中でも特に**「依存関係逆転の原則(Dependency Inversion Principle)」**に対応する設計手法であり、堅牢で拡張可能なソフトウェアアーキテクチャの構築に不可欠です。

生成日:2025/06/01