[Java] Spring Frameworkの「DI」って何?初心者が知るべき魔法の仕組み
こんにちは。ゆうせいです。
新人エンジニアのみなさん、Javaの学習は順調に進んでいますか?
基本的な文法を覚えたあと、実務や応用学習に入ると必ずと言っていいほど登場するのが Spring Framework ですよね。
でも、ドキュメントを読んでいると「DI(依存性の注入)」という言葉が出てきて、そこで思考停止してしまった経験はありませんか?
「依存性?」「注入?」「言葉が難しすぎる!」と叫びたくなる気持ち、本当によくわかります。
今日は、そんなSpring Frameworkの核心部分である DI について、専門用語をできるだけ噛み砕き、高校生でもイメージできるような例え話を使って解説していきます。これを読めば、魔法のように見えていた仕組みの裏側がハッキリと見えるようになりますよ。
さあ、一緒にSpringの世界を紐解いていきましょう!
Spring Frameworkとは?
本題のDIに入る前に、まずは Spring Framework について少しだけ整理しておきましょう。
Javaで大規模なWebアプリケーションを作ろうとすると、データベースとの接続や、セキュリティ対策、画面の表示など、やらなければならないことが山ほどあります。これらをすべてゼロから作っていたら、いくら時間があっても足りませんよね。
そこで登場するのが Spring Framework です。
これは、Webアプリ開発に必要な「便利な道具一式」が揃った、巨大なツールキットだと思ってください。
しかし、ただ道具が揃っているだけではありません。Springが世界中で愛されている最大の理由は、プログラミングを楽にするための「ある特別な仕組み」を持っているからです。その中心にあるのが、これから解説する DI なのです。
そもそもDI(依存性の注入)とは?
さて、いよいよ本題です。
DI は Dependency Injection の略で、日本語では「依存性の注入」と訳されます。
いきなり漢字ばかりで難しそうですが、安心してください。プログラムの難しい話は一旦横に置いて、身近な「ゲーム機」で考えてみましょう。
ゲーム機で例えてみましょう
あなたは、テレビゲームで遊びたいとします。
手元にはゲーム機本体があります。でも、本体だけでは遊べませんよね?そう、ゲームソフトが必要です。
このとき、もしゲーム機本体の中に「特定のゲームソフト」が溶接されていて、取り外せなかったらどうでしょうか?
「今日はRPGがしたいけど、中身はレースゲームだから遊べない…」なんてことになってしまいます。これでは不便極まりないですよね。
これをプログラムの言葉で言うと、「ゲーム機は特定のソフトに強く依存している」状態です。
そこで、現代のゲーム機はどうなっているでしょうか?
ソフトをカセットやディスクとして外から「差し込む(インジェクトする)」ことができますよね。
差し込み口さえ合っていれば、RPGでもレースゲームでも、好きなソフトに入れ替えて遊ぶことができます。
これこそが DI(依存性の注入) の考え方です!
- ゲーム機本体 = クラス(プログラムの部品)
- ゲームソフト = 依存する別のクラス
- 差し込むこと = 注入(Injection)
つまり、プログラムの中で使う「部品」を、その場で作るのではなく、外から渡してもらう仕組みのことを指します。
SpringでのDIの活用方法
では、JavaのSpring Frameworkでは、このDIをどのように活用しているのでしょうか。
通常のJavaプログラミングでは、使いたいクラスがあれば new というキーワードを使って自分でインスタンス(実体)を作りますよね。
しかし、Springの世界では、プログラマーが自分で new を書くことはほとんどありません。
なぜなら、Springには「IoCコンテナ」と呼ばれる、非常に優秀な管理人がいるからです。
IoCコンテナという名の管理人
Spring Frameworkが動いている裏側には、IoCコンテナ という巨大な倉庫のような場所があります。
Springは、アプリが起動するときに、必要なクラス(部品)をあらかじめすべて作成し、このコンテナの中にしまっておきます。ちなみに、このSpringに管理されている部品のことを Bean(ビーン) と呼びます。
そして、プログラマーが「このクラスの中で、あの部品を使いたいな」と合図を送ると、IoCコンテナが気を利かせて、必要な部品をスッと渡して(注入して)くれるのです。
自分で買い出しに行くのではなく、コンシェルジュにお願いして持ってきてもらうイメージですね。
ソースコードで見るDIの違い
言葉だけではイメージしづらいかもしれませんので、簡単なコードで違いを見てみましょう。
ここでは「勇者(Hero)」が「武器(Weapon)」を使って戦う場面を想像してください。
DIを使わない場合(従来の書き方)
まずは、DIを使わない、依存性が高い書き方です。
public class Hero {
private Sword sword;
public Hero() {
// 勇者自身が「剣」を直接作り出している
this.sword = new Sword();
}
public void attack() {
sword.slash();
}
}
このコードの問題点は、勇者が「剣(Sword)」しか使えないことです。もし「斧」や「魔法の杖」を使いたくなったら、Heroクラスのコードを書き直さなければなりません。これが「ゲームソフトが溶接された状態」です。
SpringのDIを使う場合
次に、Spring FrameworkでDIを活用した書き方です。
@Component
public class Hero {
private Weapon weapon;
// コンストラクタを通じて、外から武器を受け取る(注入される)
@Autowired
public Hero(Weapon weapon) {
this.weapon = weapon;
}
public void attack() {
weapon.use();
}
}
ここで注目してほしいポイントは2つあります。
- new Sword() が消えた勇者は自分で武器を作っていません。コンストラクタ(入口)で Weapon という「武器の総称」を受け取るように待っています。
- @Autowired という合図このアノテーション(目印)を見たSpringのIoCコンテナが、「おっ、勇者には武器が必要だな」と判断し、倉庫(コンテナ)にある適切な武器を勝手に渡してくれます。
これにより、勇者は剣だろうが斧だろうが、渡された武器を使って戦うことができるようになりました。
DIを使うメリット・デメリット
ここまで読んで、「なんとなく便利そう」とは思っていただけたでしょうか?
ここで、現場のエンジニアとして感じるメリットとデメリットを具体的に整理します。
メリット
- 部品の交換が簡単になる先ほどの例のように、武器を「剣」から「斧」に変えたい場合、Heroクラスを修正する必要がありません。渡す武器を変えるだけで済みます。仕様変更に強いプログラムになります。
- テストが圧倒的に楽になるこれが最大のメリットかもしれません。例えば「実際のデータベースに接続する部品」の代わりに、「テスト用のニセモノ部品(モック)」を注入することができます。これにより、本番環境を壊す心配なく、安全にテストを行えます。
- 開発効率が上がる「誰がいつクラスを作るか」という管理をSpringに丸投げできるため、プログラマーは「何を作るか(ビジネスロジック)」だけに集中できます。
デメリット
- 処理の流れが追いづらくなるコード上に new が書かれないため、「このクラスの実体はどこで作られたんだ?」「今どの武器が渡されているんだ?」というのが、ソースコードだけを見てもパッと分からないことがあります。これが「Springは魔法だ」と言われる所以でもあり、初心者泣かせの部分です。
- 学習コストがかかる設定の書き方やアノテーションの種類など、Spring特有のルールを覚える必要があります。最初は覚えることが多くて大変に感じるでしょう。
今後の学習の指針
いかがでしたか?
「DI」という言葉の威圧感が、少しでも和らいでいたら嬉しいです。
DIとは、要するに「使う道具を自分で作らず、外から渡してもらうこと」であり、Spring Frameworkは「優秀なコンシェルジュがそれを自動でやってくれる仕組み」のことでしたね。
さて、概念を理解したら、次は実際に手を動かしてみましょう!
これからの学習ステップとして、以下をおすすめします。
- Spring Bootを使ってみるSpring Frameworkをさらに使いやすくした「Spring Boot」というツールがあります。これを使えば、面倒な設定なしですぐにDIを体験できます。
- アノテーションを覚える今回紹介した @Autowired 以外にも、@Component、@Service、@Controller など、役割に応じた目印がたくさんあります。これらがどう違うのか調べてみてください。
- 小さなWebアプリを作る「To Doリスト」や「掲示板」など、簡単なアプリを作りながら、実際にDIがどう動いているのかを確認するのが一番の近道です。
最初は「魔法」のように感じるかもしれませんが、使いこなせばこれほど強力な武器はありません。
焦らず、一つひとつ理解を深めていってくださいね。応援しています!
それでは、また次の記事でお会いしましょう。
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール
- 代表取締役
-
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。
学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。
最新の投稿
山崎講師2025年12月30日【新人エンジニア向け】「解なし」の正体を見破る。行列式と「面積」の意外な関係
山崎講師2025年12月30日【新人エンジニア向け】連立方程式をプログラムのように解く!「逆行列」と「掃き出し法」
山崎講師2025年12月30日【新人エンジニア向け】暗記は不要!「行列の掛け算」のルールを5分でマスターする
山崎講師2025年12月30日【新人エンジニア向け】なぜ機械学習に数学が必要?行列とベクトルの基礎を5分で理解する