「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で自作フレームワークを作る方法をご紹介しました。
学べたこと:
- アノテーションの定義と使い方
- リフレクションを使ったルーティング構造
- 小さな仕組みで大きな考えを学ぶ姿勢
「なぜフレームワークは便利なのか」を実感するには、
一度でも「自分で作ってみる」経験が一番の近道です。
ぜひ本記事をきっかけに、自作フレームワークの世界にチャレンジしてみてください!