「SpringやStrutsのようなフレームワークの中身を理解したい」
「けれど大規模すぎてどこから手をつけていいか分からない」
そんな方にぴったりなのが、Javaで簡易フレームワークを自作してみることです。
依存注入・ルーティング・アノテーション処理など、フレームワークの基礎的な考え方を自分の手で作ることで、
実務で必要な設計力や仕組みへの理解が飛躍的に深まります。
この記事では、初心者〜中級者でも構築できる超シンプルなJavaフレームワークの作り方を、
コード例・図解・つまずきやすいポイントの解決策付きで詳しく解説いたします。
フレームワークとは何か?
自作して初めてわかる仕組みの大切さ
結論:フレームワークとは「よく使う仕組みを共通化した道具箱」です。
SpringやLaravelのような有名なフレームワークも、
基本的には「ルール・部品・流れ」が一式で揃ったものです。
自分でミニフレームワークを作ることで、以下の力が身につきます:
- アノテーションの使い方
- DI(依存性の注入)の考え方
- ルーティングの構造
- 処理の流れを自動化する工夫
最低限のフレームワーク構成を設計
必要な機能はたったこれだけ
結論:次の3つの機能だけで「それっぽいフレームワーク」が完成します。
- ルーティング処理(文字列から関数を呼び出す)
- DI機能(オブジェクトを自動で渡す)
- アノテーション解析(クラス・メソッドに目印を付ける)
Javaの構成イメージ:
myframework/
├─ MiniFramework.java // DI・ルーティングの仕組み
├─ Controller.java // アノテーション定義
├─ SampleApp.java // ユーザーコード(アノテーション使用)
└─ Main.java // 起動処理
アノテーションの定義:Controller.java
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Controller {
String path();
}
ユーザーコードの実装例:SampleApp.java
@Controller(path = "/hello")
public class SampleApp {
public void sayHello() {
System.out.println("こんにちは!フレームワークから呼ばれました。");
}
}
フレームワーク本体:MiniFramework.java
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
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で自作フレームワークを作る方法をご紹介しました。
学べたこと:
- アノテーションの定義と使い方
- リフレクションを使ったルーティング構造
- 小さな仕組みで大きな考えを学ぶ姿勢
「なぜフレームワークは便利なのか」を実感するには、
一度でも「自分で作ってみる」経験が一番の近道です。
ぜひ本記事をきっかけに、自作フレームワークの世界にチャレンジしてみてください!