はじめに
Spring を触っていると必ず出てくる言葉、IoCコンテナ(Inversion of Control Container)。 「DI とどう違うの?」「コンテナって何をしているの?」 そんな疑問を持つ方も多いと思います。
この記事では、IoCコンテナを やさしく・実務で役立つ形 で整理します。 まずはコードを見て、そこから少しずつ理解していきましょう。
まずはコードを確認
@Service
public class GreetingService {
public String greet() {
return "Hello!";
}
}
@RestController
public class HelloController {
private final GreetingService greetingService;
public HelloController(GreetingService greetingService) {
this.greetingService = greetingService;
}
@GetMapping("/hello")
public String hello() {
return greetingService.greet();
}
}このコード、前回の DI の例と同じですが、
実はこの裏側で IoCコンテナがずっと働いています。
コードのしくみを解説
IoCコンテナとは
一言でいうと、
Spring が管理する「オブジェクト置き場」 です。
もう少し丁寧に言うと、
- オブジェクト(Bean)を作って
- 必要なところに渡して
- ライフサイクルも面倒を見てくれる
そんな“管理人さん”のような存在です。
IoC(制御の反転)とは
本来、オブジェクトの生成や管理は開発者が行います。 しかし Spring では、
- どのクラスを作るか
- いつ作るか
- どこに渡すか
これらの“制御”を Spring 側が担当します。
これが 制御の反転(Inversion of Control) です。
DI と IoC の関係
DI は「必要なものを注入する仕組み」。 IoC は「その注入を実現するための土台」。
つまり、
DI を支えているのが IoCコンテナ という関係になります。
あわせて知っておきたいポイント
IoCコンテナが管理するもの
- @Component
- @Service
- @Repository
- @Controller / @RestController
- @Configuration
- @Bean で定義したもの
これらはすべて IoCコンテナの管理下に置かれます。
Bean のライフサイクル
IoCコンテナは Bean を
- 作る
- 初期化する
- 必要な場所に渡す
- 最後に破棄する
まで面倒を見てくれます。
ApplicationContext が IoCコンテナ
Spring Boot では、
ApplicationContext が IoCコンテナの実体です。
使うときに気をつけたいこと
new で作るとコンテナ管理外になる
IoCコンテナの管理外で作ったオブジェクトにはDI が効きません。
Bean のスコープに注意
- Singleton(デフォルト)
- Prototype
- Request
- Session
用途に応じて使い分ける必要があります。
コンポーネントスキャンの範囲
パッケージ構成によっては
Bean が見つからず DI が失敗することがあります。
まとめ
IoCコンテナは、Spring の“心臓部”のような存在です。
DI を支え、Bean を管理し、アプリケーション全体を整えてくれます。
難しく聞こえますが、
「Spring がオブジェクトを管理してくれる仕組み」
と理解できれば十分です。

IoCコンテナは最初とっつきにくいですが、
「Spring が全部面倒を見てくれる箱」と思うと急に理解が進みます。
あなたの開発が、今日より少しだけ楽になりますように。

コンテナさんって、みんなのことを見守ってくれる管理人さんみたいだね。

コメント