🧑‍💻 Spring Framework 講座【第6回】Springコンテナの心臓部!〜IoCコンテナとBeanの基礎〜

docs

前回は、Spring Frameworkの核となる考え方、DI (依存性の注入)IoC (制御の反転) について学びました。DI/IoCの目的は、「柔軟で変更に強いシステム」を実現することでしたね。

今回は、そのDI/IoCを実現しているSpringの土台、すなわち「IoCコンテナ」とは具体的に何で、コンテナが管理している「Bean (ビーン)」とは何なのかを深掘りします。

1. IoCコンテナ(Springコンテナ)の役割

IoCコンテナ(またはSpringコンテナ)は、Springアプリケーション全体を管理する**「部品の倉庫」**のようなものです。

このコンテナは、アプリケーションの起動時に生成され、以下の重要な役割を果たします。

  1. Bean (部品) の生成と管理: 必要なクラスのインスタンス(オブジェクト)を自動で作成し、ライフサイクル(生成から破棄まで)を管理します。
  2. 依存性の注入 (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接続など)を担当するクラス。データベースとのデータのやり取りを専門に行うクラス。
@ControllerWebリクエストの受付と応答を担当するクラス。ユーザーからの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)の詳解 にご期待ください!

コメント

タイトルとURLをコピーしました