Spring Bean

Spring Beanとは?

  • Spring Frameworkが管理する独立したオブジェクトです。
  • 通常のJavaオブジェクトと変わりませんが、Springが管理します。
  • 簡単に言えば、何らかの処理を行い、Springの管理下でいつでもDIに使用できるオブジェクトです。

Springコンテナ: IoC、Bean、DIコンテナとも呼ばれる

コンテナとは?

  • 一般にコンテナはインスタンスのライフサイクルを管理し、作成したインスタンスへ追加機能を提供します。
    • つまり、アプリケーションコードを参照し、オブジェクトの生成と破棄を制御します。

Springコンテナ

  • Spring Beanオブジェクトを管理します。
  • 開発者が定義したBeanクラスに基づき、Beanオブジェクトを生成して使用します。
    • 開発者ではなくコンテナがオブジェクトを生成するためDIが可能になり、Springコンテナが制御できます。

IoC(Inversion of Control)とは?

  • 開発者が制御していたプログラムの流れをコンテナが制御するため、制御の反転と呼ばれます。
  • Spring IoCはオブジェクトの生成とライフサイクルを管理します。制御権がSpring Frameworkへ移ることで、DIやAOPが可能になります。

Spring Beanの5つのスコープ

  • singleton
    • 1つのBean定義に対し、Spring IoCコンテナ内に1つのオブジェクトだけが存在します。
    • スコープを指定しない場合のデフォルトです。
  • prototype
    • 1つのBean定義に対し、複数のオブジェクトが存在できます。
    • リクエストごとに新しいオブジェクトを生成します。
      • 依存関係を持つBeanへ注入される際に、新しいprototype Beanが生成されます。
      • 通常どおりガベージコレクションで削除されます。
  • request
    • 1つのHTTPリクエストのライフサイクルに1つのオブジェクトが存在します。
    • 各HTTPリクエストは独自のオブジェクトを持ちます。
    • Web対応のSpring ApplicationContextでのみ有効です。
  • session
    • 1つのHTTPセッションのライフサイクルに1つのオブジェクトが存在します。
    • Web対応のSpring ApplicationContextでのみ有効です。
  • global session
    • 1つのグローバルHTTPセッションのライフサイクルに1つのオブジェクトが存在します。
    • 一般にポートレットコンテキストで有効です。
    • Web対応のSpring ApplicationContextでのみ有効です。

JavaアノテーションによるSpring Beanの生成

@Bean

  • 外部ライブラリで定義されたクラスをSpring Beanとして登録する場合に使用します。
    • 開発者が直接制御できない外部ライブラリに@Beanを使用します。
    • @Configurationを宣言したクラス内で使用します。
    • 開発者が作成したメソッドの戻り値がBeanになります。

@Component

  • 開発者が作成したクラスをSpring Beanとして登録する場合に使用します。
    • 開発者が作成したクラスがBeanになります。

特定の役割がある場合は、次のアノテーションを使用します。

  • @Controller
    • 基本的に@Componentと同じです。
    • プレゼンテーション層のコンポーネントであることを強調します。
  • @Service
    • 基本的に@Componentと同じです。
    • ビジネスロジックを実装するビジネス層のコンポーネントであることを強調します。
  • @Repository
    • 基本的に@Componentと同じです。
    • データベースアクセスなど、永続化層のコンポーネントであることを強調します。
    • プラットフォーム固有の例外を捕捉し、Springの非チェック例外をスローします。