「Spring Framework」における、依存関係の注入(DI)と制御の反転(IoC)とは:特徴や利点を解説
TechTargetは、Javaのオープンソースフレームワーク「Spring Framework」に関する記事を公開した。制御の反転(IoC)と依存関係の注入(DI)を中心に特徴や利点を解説する。
TechTargetは2024年9月16日(米国時間)、Javaのオープンソースフレームワーク「Spring Framework」(以下、Spring)に関する記事を公開した。
Spring Frameworkをフレームワークたらしめている理由はどこにあるのだろうか。その答えが「制御の反転」(IoC:Inversion of Ccontrol)だ。
「Spring」「Flask」「Angular」などのフレームワークでは、IoCを提供する。これが、開発者が呼び出す関数を提供するだけのライブラリとの大きな違いだ。
IoCとは?
IoCとは1つのシンプルな設計原則で、複雑な操作(ライフサイクル管理、コンポーネント構成、システムとの低レベルの操作など)を外部化し、開発者がコアビジネスロジックを明確かつ簡潔に保てるようにする。このように外部化する要素を管理するのが、SpringやAngularなどの各種IoCフレームワークだ。
IoCのメリット
IoCフレームワークは開発者のコードをクリーンに保つだけでなく、次のようなメリットもある。
- コードと外部に取り出される要素が疎結合される
- 複雑なロジックを外部の特殊なフレームワークに取り出す
- 開発者がコア機能の実現に専念できることで、市場リリースまでの時間が短くなる
IoCと依存関係の注入の仕組み
IoCと依存関係の注入(DI:Dependency Injection)は、通常密接に関係する。その理由を理解するため、IoCの次の2つの目的について考える。
- ビジネスロジックを明確かつ簡潔に保つ
- 外部に取り出したリソースを疎結合する
開発者が作成したコンポーネントのライフサイクル(作成、プロビジョニング、さらにはガベージコレクションなど)を管理するのが、IoCフレームワークだ。とはいえ、Spring IoCコンテナが管理するクラスの一つにコードからアクセスする必要がある場合、どうすべきか。
その方法の一つがSpring IoCコンテナに直接アクセスすることだ。ただし、この方法は、コードを簡潔にして疎結合するという目標に反する。IoCコンテナにアクセスするコードでアプリケーションが複雑になり、ビジネスロジックがSpringと緊密に結合される。
ここで使われるのがDIだ。
SpringにおけるDI
Spring IoCコンテナがアプリケーション内の2つのコンポーネントを管理し、一方のコンポーネントが他方に依存する場合は、実行時にその依存関係を満たす(DI)よう、Springに依頼する。このDIを可能にする仕組みはコードの外部で行われるため、コードは簡潔に保たれ、フレームワークによって疎結合される。
以下の例では、@AutowiredアノテーションによってDIを実行する場所をSpring IoCコンテナに指示している。
@Component class Taxi { @Autowired PriceMeter priceMeter; } @Component class PriceMeter { double price; }
この例では、タクシー(Taxi)は料金メーター(PriceMeter)を必要とすることが示されている。これをプログラミングのコンテキストにすると、TaxiクラスはPriceMeterクラスと依存関係があることになる。
DIにより、この要件は実行時に解決される。つまりSpringへの直接参照はこのアノテーションだけになる。さらに、Spring XMLファイルまたはSpring @Configurationクラスを使えば、上記の@Component参照を完全に取り除くことができる。
これが、SpringにおけるIoCとDIの基本だ。IoCとは、コードを明白かつ簡潔に保てるようにするシンプルな設計原則の一つだ。一方、DIはIoCフレームワーク(Springなど)を使って、コードへの直接参照をなくす。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- 「Spring Framework」と「Spring Boot」の違い Spring Bootが「こだわりのある」フレームワークな理由
Spring FrameworkとSpring Bootは、Java開発において異なる役割を持つツールだ。どのような目的を持って登場し、ソフトウェアアーキテクトやプログラマーにどう役立つのかを整理する。 - Springにおける「RestController」と「Controller」の違いとは
Javaの開発フレームワーク「Spring Framework」におけるControllerとRestControllerの違い、Restful API開発時にRestControllerを使用するメリットを紹介する。 - 「State of JavaScript 2023」公開 2万人強が回答、最も勢いのあるフレームワークやツールとは
DevographicsはJavaScriptの利用動向に関する年次調査「State of JavaScript 2023」の結果を発表した。JavaScriptを開発に利用する2万3540人の回答を集計、分析した調査だ。勢いのあるフレームワークやツール、技術ごとのユーザーによる評価に基づいて、安心して採用できる技術、推奨しづらい技術、利用を見直すべき技術を明らかにしている。