【Java入門】簡易フレームワークの作り方完全ガイド|アノテーション×DIで学ぶ設計力

プログラミング

「SpringやStrutsのようなフレームワークの中身を理解したい」
「けれど大規模すぎてどこから手をつけていいか分からない」
そんな方にぴったりなのが、Javaで簡易フレームワークを自作してみることです。

依存注入・ルーティング・アノテーション処理など、フレームワークの基礎的な考え方を自分の手で作ることで、
実務で必要な設計力や仕組みへの理解が飛躍的に深まります。

この記事では、初心者〜中級者でも構築できる超シンプルなJavaフレームワークの作り方を、
コード例・図解・つまずきやすいポイントの解決策付きで詳しく解説いたします。


フレームワークとは何か?

自作して初めてわかる仕組みの大切さ

結論:フレームワークとは「よく使う仕組みを共通化した道具箱」です。

SpringやLaravelのような有名なフレームワークも、
基本的には「ルール・部品・流れ」が一式で揃ったものです。

自分でミニフレームワークを作ることで、以下の力が身につきます:

  • アノテーションの使い方
  • DI(依存性の注入)の考え方
  • ルーティングの構造
  • 処理の流れを自動化する工夫

最低限のフレームワーク構成を設計

必要な機能はたったこれだけ

結論:次の3つの機能だけで「それっぽいフレームワーク」が完成します。

  • ルーティング処理(文字列から関数を呼び出す)
  • DI機能(オブジェクトを自動で渡す)
  • アノテーション解析(クラス・メソッドに目印を付ける)

Javaの構成イメージ:

1
2
3
4
5
myframework/
├─ MiniFramework.java       // DI・ルーティングの仕組み
├─ Controller.java          // アノテーション定義
├─ SampleApp.java           // ユーザーコード(アノテーション使用)
└─ Main.java                // 起動処理

アノテーションの定義:Controller.java

1
2
3
4
5
6
7
import java.lang.annotation.*;
 
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Controller {
    String path();
}

ユーザーコードの実装例:SampleApp.java

1
2
3
4
5
6
@Controller(path = "/hello")
public class SampleApp {
    public void sayHello() {
        System.out.println("こんにちは!フレームワークから呼ばれました。");
    }
}

フレームワーク本体:MiniFramework.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.lang.annotation.Annotation;
import java.lang.reflect.*;
 
public class MiniFramework {
    public static void run(Class<?>[] classes, String inputPath) {
        for (Class<?> cls : classes) {
            if (cls.isAnnotationPresent(Controller.class)) {
                Controller ctrl = cls.getAnnotation(Controller.class);
                if (ctrl.path().equals(inputPath)) {
                    try {
                        Object obj = cls.getDeclaredConstructor().newInstance();
                        for (Method m : cls.getDeclaredMethods()) {
                            if (m.getName().startsWith("say")) {
                                m.invoke(obj);
                            }
                        }
                    } catch (Exception e) {
                        System.out.println("エラー発生:" + e.getMessage());
                    }
                }
            }
        }
    }
}

実行ファイル:Main.java

1
2
3
4
5
6
7
8
public class Main {
    public static void main(String[] args) {
        MiniFramework.run(
            new Class[]{SampleApp.class},
            "/hello"
        );
    }
}

よくあるエラーとその解決方法

躓きやすいポイントと対処法を紹介します

  • アノテーションが無視される
  • @Retention(RetentionPolicy.RUNTIME) を忘れると実行時に認識されません。
  • newInstance()のエラー
  • デフォルトコンストラクタがないとエラーになります。引数なしのコンストラクタを必ず用意しましょう。
  • メソッドが呼ばれない
  • invoke()は例外を投げるため、try-catchで囲っておきましょう。

応用機能でさらに学べる

発展例で実力をさらに高めましょう

  • @Route(method="GET", path="/user") のようなアノテーションを追加
  • パラメータを受け取る構造に変更
  • ファイルや設定クラスからルートを読み込む機能

完成形まとめと構成

  • MiniFramework.java:ルーティング・DI実装
  • Controller.java:アノテーション定義
  • SampleApp.java:ユーザーコード
  • Main.java:起動クラス

まとめ:Javaの中身を理解する最短ルート

この記事では、Javaで自作フレームワークを作る方法をご紹介しました。

学べたこと:

  • アノテーションの定義と使い方
  • リフレクションを使ったルーティング構造
  • 小さな仕組みで大きな考えを学ぶ姿勢

「なぜフレームワークは便利なのか」を実感するには、
一度でも「自分で作ってみる」経験が一番の近道です。

ぜひ本記事をきっかけに、自作フレームワークの世界にチャレンジしてみてください!

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