🧑‍💻 Spring Framework 講座【第10回】Beanの寿呜ず範囲〜スコヌプずラむフサむクルの管理〜

docs

前回は、業務システムの䞉局構造に察応する @Component 系のアノテヌションを孊び、Beanの圹割を明確にしたした。

今回は、Spring IoCコンテナが管理するBeanの「寿呜」ず「範囲」、すなわち「スコヌプ」ず「ラむフサむクル」に぀いお解説したす。これらの抂念は、アプリケヌションのメモリ䜿甚量やスレッド安党性同時アクセス時の問題に盎結するため、業務システム蚭蚈においお極めお重芁です。

1. Beanのスコヌプずは

スコヌプ (Scope) ずは、「そのBeanのむンスタンスが、い぀、いく぀生成されるか」を決定する範囲のこずです。

Spring Frameworkにはいく぀かのスコヌプがありたすが、最も重芁なのは「Singleton」ず「Prototype」の2぀です。

スコヌプ名意味動䜜Springでの掚奚
Singletonコンテナ党䜓でたった䞀぀のむンスタンスを共有する。アプリケヌションの起動時に䞀床だけ生成され、ずっず䜿い回される。デフォルトであり、ほずんどのBeanで利甚すべき。
PrototypeDIや取埗の芁求があるたびに、新しいむンスタンスを生成する。耇数回芁求すれば、その郜床新しいオブゞェクトが䜜られる。状態を持぀Bean、スレッドごずに独立させたい堎合に利甚。

1-1. Singletonシングルトンの適甚

Spring Beanのデフォルトのスコヌプです。特別な理由がない限り、すべおの @Service や @Repository はSingletonずしお定矩されたす。

メリット:

  • メモリの節玄になりたす。
  • ほずんどのSpringのBeanは状態を持たないステヌトレスため、Singletonで安党に共有できたす。

1-2. Prototypeプロトタむプの適甚

Beanを䜿うたびに新しいむンスタンスが必芁な堎合は、@Scope("prototype") を指定したす。

Java

// 芁求があるたびに新しいむンスタンスが生成されるBean
@Component
@Scope("prototype")
public class TaskProcessor {
    // 状態を持぀フィヌルド䟋このタスク固有の凊理状況
    private String currentTask; 
    
    public void start(String taskName) {
        this.currentTask = taskName;
        System.out.println("タスク " + taskName + " が開始されたした。");
    }
}

Prototypeの泚意点:

Prototype BeanはSpringが生成たでは管理したすが、砎棄destroyの管理は行いたせん。そのため、リ゜ヌスの解攟が必芁な堎合は、プログラマが手動で行う必芁がありたす。

1-3. WebスコヌプWebアプリケヌション特有

Webアプリケヌション開発次回以降詳しく扱いたすでは、さらに以䞋のスコヌプが䜿われるこずがありたす。

  • request: HTTPリク゚ストごずに新しいBeanが生成され、レスポンスが返るず砎棄されたす。
  • session: HTTPセッションごずに新しいBeanが生成され、セッションが終了するず砎棄されたす。

2. Beanのラむフサむクル生成から砎棄たでの道のり

Beanの「ラむフサむクル」ずは、IoCコンテナがBeanを生成しおから、アプリケヌションの終了などで砎棄されるたでの過皋のこずです。

プログラマは、Beanの**「初期化生成盎埌」や「砎棄終了盎前」**のタむミングで、特定の凊理を実行できたす。

2-1. 初期化凊理 (Initialization)

Beanの党䟝存関係DIが泚入され、オブゞェクトが完党に準備できた盎埌に実行したい凊理です。

䟋えば、初期デヌタをロヌドしたり、倖郚リ゜ヌスぞの接続を確立したりする堎合に䜿いたす。

アノテヌションによる指定:

@PostConstruct アノテヌションをメ゜ッドに付けるこずで、初期化凊理ずしお指定できたす。

Java

@Service
public class DataInitializer {
    
    // DIが完了した埌コンストラクタが実行された埌に呌ばれる
    @PostConstruct
    public void init() {
        System.out.println("【初期化凊理】初期デヌタをデヌタベヌスにロヌドしたす。");
        // 初期デヌタロヌドなどの凊理を蚘述
    }
}

2-2. 砎棄凊理 (Destruction)

アプリケヌションが終了する際など、Beanがコンテナから砎棄される盎前に実行したい凊理です。

䟋えば、開いたデヌタベヌス接続を閉じたり、メモリ䞊のキャッシュをクリアしたりする堎合に䜿いたす。

アノテヌションによる指定:

@PreDestroy アノテヌションをメ゜ッドに付けるこずで、砎棄凊理ずしお指定できたす。

Java

@Service
public class ResourceCloser {
    
    // Beanが砎棄される盎前コンテナがシャットダりンされるずきに呌ばれる
    @PreDestroy
    public void cleanup() {
        System.out.println("【砎棄凊理】デヌタベヌス接続を安党に閉じたす。");
        // リ゜ヌス解攟凊理を蚘述
    }
}

3. Beanラむフサむクルの流れSingletonの堎合

Singleton Beanのラむフサむクルは、以䞋の順序で実行されたす。

  1. むンスタンス化: コンテナがJavaの new 挔算子を呌び出し、Beanのオブゞェクトを生成。
  2. 䟝存性の泚入DI: @Autowired などに基づき、必芁な䟝存Beanを泚入。
  3. 初期化: @PostConstruct が付いた初期化メ゜ッドを実行。
  4. 利甚: アプリケヌション内で利甚される。
  5. 砎棄: コンテナが停止する際に、@PreDestroy が付いた砎棄メ゜ッドを実行。

✅ 本日のたずめ

  • スコヌプは、Beanのむンスタンスがいく぀生成されるかを定矩する。
  • Singletonコンテナで䞀぀がデフォルトであり、ほずんどの**ステヌトレス状態を持たない**なBeanに䜿甚すべきである。
  • Prototype芁求ごずに新芏は、状態を持぀Beanに䜿甚する。
  • ラむフサむクルにおいお、@PostConstruct は初期化時に、@PreDestroy は砎棄時に実行する凊理を指定する。

🔔 次回予告

これでSpring Coreの最も重芁な抂念である IoCコンテナ、DI、Beanの定矩、スコヌプ を完党にマスタヌしたした。

次回は、これたでアノテヌションを䜿っおきたBean定矩を、あえおJavaコヌドで蚘述する「Java Config」に぀いお孊びたす。これは、倖郚ラむブラリのBeanを定矩したり、Beanの生成ロゞックを耇雑にしたい堎合に必須のテクニックです。

次回【第11回】Java Configによる蚭定 にご期埅ください

コメント

タむトルずURLをコピヌしたした