前回は、Spring Frameworkの核となる考え方、DI (依存性の注入) と IoC (制御の反転) について学びました。DI/IoCの目的は、「柔軟で変更に強いシステム」を実現することでしたね。
今回は、そのDI/IoCを実現しているSpringの土台、すなわち「IoCコンテナ」とは具体的に何で、コンテナが管理している「Bean (ビーン)」とは何なのかを深掘りします。
1. IoCコンテナ(Springコンテナ)の役割
IoCコンテナ(またはSpringコンテナ)は、Springアプリケーション全体を管理する**「部品の倉庫」**のようなものです。
このコンテナは、アプリケーションの起動時に生成され、以下の重要な役割を果たします。
- Bean (部品) の生成と管理: 必要なクラスのインスタンス(オブジェクト)を自動で作成し、ライフサイクル(生成から破棄まで)を管理します。
- 依存性の注入 (DI): あるBeanが別のBeanを必要としているとき、自動でそれらを結びつける(注入する)処理を行います。
このコンテナは、Javaコードでいうと主に ApplicationContext というインターフェースを通じて表現されます。私たちは通常、この ApplicationContext のインスタンスに意識的に触れることはありませんが、内部でSpring Bootが自動で生成し、アプリケーション全体を制御しています。
2. Beanとは?:コンテナが管理する「特別なオブジェクト」
「Bean」とは、Spring IoCコンテナによって生成され、管理されているオブジェクトのことです。
Javaの new 演算子で作成されるただのオブジェクトと異なり、Beanはコンテナ内で特別な扱いを受けます。
普通のオブジェクト
Java
// newで生成され、他の部品との依存関係は自分で管理
MyClass obj = new MyClass();
Spring Bean
Java
// Springコンテナが生成・管理し、DIの対象となる
// プログラマはnewを使わない
私たちは、どのクラスをBeanとしてコンテナに登録するかをSpringに教えるだけで済みます。
3. Beanの定義方法(2つのアプローチ)
Springに「このクラスをBeanとして管理してほしい」と伝える方法は、主に2つあります。
3-1. (主流) アノテーションベースの設定
Spring Bootでは、特定の役割を持つクラスにアノテーション(@から始まる特別な印)を付けるのが主流です。Springがアプリケーションをスキャンし、これらのアノテーションを見つけると自動的にBeanとして登録します。
| アノテーション | 役割 | 用途 |
@Component | 汎用的なSpringの部品であることを示す最も基本的なアノテーション。 | 他の専用アノテーションに該当しない汎用的なユーティリティクラスなど。 |
@Service | 業務ロジック(処理)を記述するクラス。 | 顧客登録、在庫計算などビジネス処理の中心となるクラス。 |
@Repository | データアクセス(DB接続など)を担当するクラス。 | データベースとのデータのやり取りを専門に行うクラス。 |
@Controller | Webリクエストの受付と応答を担当するクラス。 | ユーザーからのHTTPリクエストを受け付けるクラス。 |
【サンプルコード】
@Service アノテーションを付けるだけで、UserService はSpringコンテナにBeanとして登録されます。
Java
// このクラスをSpringのService Beanとして登録
@Service
public class UserService {
public String getUserName(int id) {
// ... 処理
return "ユーザー" + id;
}
}
// ----------------------------------------------------
@Controller
public class UserController {
// SpringがUserService Beanを自動で注入してくれる
private final UserService userService;
// コンストラクタインジェクションによりDIされる
public UserController(UserService userService) {
this.userService = userService;
}
public void handleRequest() {
String name = userService.getUserName(1);
System.out.println("取得した名前: " + name);
}
}
3-2. Java Configによる設定
アノテーションを付けられない外部ライブラリのクラスや、特殊な設定が必要なBeanを定義したい場合は、Javaコード(メソッド)として直接Beanを定義します。
@Configuration: そのクラスがBean定義を行う設定クラスであることを示す。@Bean: メソッドの戻り値として返されるオブジェクトをSpring Beanとしてコンテナに登録する。
【サンプルコード】
Java
// このクラスはSpringの設定クラスとして扱われる
@Configuration
public class AppConfig {
// このメソッドが返すオブジェクト(ここではMyExternalLibrary)がBeanとして登録される
@Bean
public MyExternalLibrary externalLibrary() {
// ここで外部ライブラリの初期化処理を記述
return new MyExternalLibrary("設定値A");
}
// 他のクラスでexternalLibrary Beanが使えるようになる
}
4. まとめ:なぜアノテーションベースが主流なのか
Spring Bootの登場以降、アノテーションベースの設定(@Component系)が主流です。これは、開発者が明示的な設定ファイルを書く手間を省き、コードの可読性を高めるためです。
しかし、特定の理由で Bean のカスタマイズが必要な場合は、@Configuration + @Bean の形式を使います。
どちらの方法を使っても、最終的にコンテナがBeanとして管理し、DIを介して連携するという基本構造は変わりません。
✅ 本日のまとめ
- IoCコンテナ(
ApplicationContext)は、Springアプリケーションの中心であり、Beanの生成・管理とDIを行う。 - Beanとは、IoCコンテナによって管理されているオブジェクトのこと。
- Beanの定義は、
@Component,@Serviceなどのアノテーションが主流。 - 外部ライブラリなど特別な場合は、
@Configurationクラス内の@Beanメソッドで定義する。
🔔 次回予告
今回、@Controller の中で UserService を利用する際に、「コンストラクタインジェクション」を使ってDIを行いました。
次回は、この「依存性の注入(DI)」について、コンストラクタ、セッター、フィールドという3つの注入方法を深く掘り下げ、それぞれのメリット・デメリットを理解します。業務システム開発において、**「どのDI方法を使うべきか」**という設計のベストプラクティスを確立しましょう。
次回:【第7回】依存性の注入(DI)の詳解 にご期待ください!


コメント