前回までの4回で、Javaの基本とプロジェクト管理の土台が整いました。いよいよ今回から、Spring Frameworkの核となる考え方に入っていきます。
今回のテーマは、Springの最も重要なコンセプトである「DI(依存性の注入)」と「IoC(制御の反転)」です。この考え方を理解できると、なぜSpringが業務システム開発で圧倒的な支持を得ているのかがわかります。
1. Spring Frameworkが解決する「設計の悩み」
大規模な業務システムを作る際、プログラマは必ずある「悩み」に直面します。それは「オブジェクト間の依存関係」です。
1-1. 従来のJavaプログラムの問題点(依存関係の結合が強い)
オブジェクト指向では、複数のクラス(部品)を組み合わせて機能を実現します。例えば、顧客情報を保存する機能を作りたいとします。
Java
// 従来のJavaコードの例
public class CustomerService {
// ① サービス層がデータベースの部品(Repository)を「自分で」作っている
private CustomerRepository repository = new new CustomerRepository();
public void saveCustomer() {
// ② newで作成した部品に処理を依頼
repository.save();
}
}
このコードの問題点は、「CustomerServiceがCustomerRepositoryに強く依存している」ことです。
- もし、データベースの種類をMySQLからPostgreSQLに変えたくなっても(CustomerRepositoryの中身が変わっても)、CustomerServiceのコードを書き換える必要があります。
- テストをする際、実際のデータベースを使わず**模擬の部品(モック)**に差し替えたくても、newで固定されているため難しいです。
このように、部品同士の結びつきが強すぎると、**「柔軟性の低い」「変更に弱い」**システムになってしまいます。
2. Springの核となる考え方 (1):IoC(制御の反転)
IoC (Inversion of Control: 制御の反転) とは、「誰がオブジェクトを作るか」というプログラムの「制御」を反転させるという考え方です。
- 従来: プログラマが**new**を使って「自分で」オブジェクトを生成し、制御する。
- Spring/IoC: オブジェクトの生成や管理を、プログラマではなく**Spring(のコンテナ)**に任せる。
Springは、プログラム実行時に全ての部品(オブジェクト)を自動で作成し、まとめて管理する場所を持っています。これを「IoCコンテナ」または「Springコンテナ」と呼びます。
プログラマは必要な部品の定義だけを行い、コンテナが必要に応じてそれらを生成・提供してくれます。
3. Springの核となる考え方 (2):DI(依存性の注入)
IoCコンテナが部品を管理してくれるようになったとして、サービスがリポジトリを「使う」にはどうすれば良いでしょうか?ここで登場するのが DI (Dependency Injection: 依存性の注入) です。
DIとは、あるオブジェクトが必要とする別のオブジェクト(依存関係)を、外部(IoCコンテナ)から「注入」してもらう仕組みです。
これにより、先ほどのCustomerServiceは以下のように劇的に変わります。
DIを適用したSpringコードの例
Java
// Springを使用したJavaコードの例
// @Serviceアノテーションは、このクラスをSpringの部品(Bean)として登録することを意味する
@Service
public class CustomerService {
// ① newを使わず、必要な部品の「宣言」だけを行う
private CustomerRepository repository;
// ② コンストラクタを使って依存関係を注入してもらう
@Autowired // Springに注入を依頼するアノテーション
public CustomerService(CustomerRepository repository) {
this.repository = repository;
}
// ③ 注入された部品を使って処理を実行
public void saveCustomer() {
repository.save();
}
}
【DIのメリット】
- CustomerServiceはnewを使わないため、**どの具体的なCustomerRepositoryが使われるかを知りません**。
- CustomerServiceが「**CustomerRepositoryの役割を持つものが一つ必要だ**」という宣言をするだけで、Springコンテナが自動で適切な部品を「注入」してくれます。
- これにより、部品同士の結合が緩くなり、柔軟で変更に強いシステムが実現します。これがSpring Frameworkの存在意義そのものです。
4. まとめ:DIとIoCの関係
**IoC(制御の反転)**という思想を実現するための具体的な手段が DI(依存性の注入) です。
| 用語 | 意味 | 解決する問題 |
| IoC | オブジェクトの生成や管理をコンテナに反転させる。 | 誰が部品を作るかという制御の問題。 |
| DI | 必要な部品をコンテナから注入してもらう。 | 部品同士の強い依存関係の問題。 |
| IoCコンテナ | Springが部品を管理する場所。 | – |
このDI/IoCこそが、Springが提供する全ての機能(Web、DB接続、セキュリティなど)の土台となっています。
✅ 本日のまとめ
- Spring Frameworkは、DI (依存性の注入) と IoC (制御の反転) を通じて、部品同士の結合度を下げ、柔軟でテストしやすいシステム開発を実現する。
- IoCコンテナが全ての部品(Bean)を管理し、@Autowiredなどのアノテーションを通じて必要な部品を自動で「注入」してくれる。
🔔 次回予告
DI/IoCの概念は理解できましたが、Springコンテナが実際にどのようにして私たちのコードを部品(Bean)として認識し、管理しているのでしょうか?
次回は、このIoCコンテナの中身に踏み込み、「Bean」の定義方法と、「ApplicationContext」の役割について、より具体的なコードを通じて解説します。
次回:【第6回】IoCコンテナとBeanの基礎 にご期待ください!


コメント