かなり前に、はじめてSpring Bootの案件に入った際に、マイコン脳の老プログラマが最後まで腑に落ちなかったのはアノテーションだった。
簡単に言うと「初期化されていないメンバーになんで値が入っているのか(Autowired)」「存在しないメソッドが何で呼び出せるのか(Lombok,JPA)」
便利なのは確かであったが当時はそういう約束事だと考えて進めるしかなかった。今だって中の詳細ロジックが読めている訳ではない。ただ細部はウソでもよいので自分が納得できる理由が説明できておかないと解決困難な問題を追跡する際に当て外れな部分の調査に負荷が発生するので、問題解決の枝刈りをするためにも「結局何なのか」を自分なりに理解しておく必要があった。
ネットでごそごそ調べた調べた結果、アノテーションはその名の通り「単なるラベル」だった。
プログラムのソースのメソッドやクラス、メンバ変数の位置にラベルでマークを付けるもの。
ラベルがどう使われるかはいくつか種類があり、
- コンパイル時に探すことができて、jar出力結果を変える
- jarの中にそのままラベルを付けて、実行時に変数やメソッドに位置を探せるもの
実行時ラベルの例
で、ツール/フレームワーク側でラベルを探索することで、よい意味でのインチキめいたハックをしている訳だ。
とりあえず自身としてはそう理解できていればよいと考えた。細部はAutowiredやLombok等で。