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とは1つのシンプルな設計原則で、複雑な操作(ライフサイクル管理、コンポーネント構成、システムとの低レベルの操作など)を外部化し、開発者がコアビジネスロジックを明確かつ簡潔に保てるようにする。このように外部化する要素を管理するのが、SpringやAngularなどの各種IoCフレームワークだ。
IoCフレームワークは開発者のコードをクリーンに保つだけでなく、次のようなメリットもある。
IoCと依存関係の注入(DI:Dependency Injection)は、通常密接に関係する。その理由を理解するため、IoCの次の2つの目的について考える。
開発者が作成したコンポーネントのライフサイクル(作成、プロビジョニング、さらにはガベージコレクションなど)を管理するのが、IoCフレームワークだ。とはいえ、Spring IoCコンテナが管理するクラスの一つにコードからアクセスする必要がある場合、どうすべきか。
その方法の一つがSpring IoCコンテナに直接アクセスすることだ。ただし、この方法は、コードを簡潔にして疎結合するという目標に反する。IoCコンテナにアクセスするコードでアプリケーションが複雑になり、ビジネスロジックが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.