Lucy を読む (1)
全然勉強せずに遊び呆けてます。唐突に T2-framework の Lucy に興味を持ったので読 Lucy してみます。超気まぐれ。
何で興味を持ったかというと、先日 Seasar のソースコードを読んだので別の DI コンテナのソースコード読んでみたかったというのと、T2 自体がイマドキのライブラリなので、これを読んだらイマドキの Java ソースコードを勉強出来ると思ったからです。あ、web アプリケーションは作ったことが無いので T2 についてはサッパリ分かりません、ということで華麗にスルーします。ごめんなさい。
さて、Lucy は軽量な DI コンテナという点を売りにしているそうです。Google Guice と比べてみたい気もしますが、取り敢えずサンプルを読んで大体使用方法は分かったので、気が向くままに読んでみようと思います。取り敢えず Lucy をインポートして軽く読んだ中で「面白いなー」と感じた部分をメモ。
LucyImpl#assertComponentAnnotation
アノテーションを使用してコンポーネントをインジェクションする場合, @Component アノテーションが付与されているか否かを調べるアサーション処理です。Lucy は(多分)インジェクションする Bean に対して @Component を付けることは普通は無くて、@SingletonScope や @PrototypeScope のように Bean のスコープを定義するアノテーションを付与します。ここで面白いのは, 実は @SingletonScope や @PrototypeScope が @Component を付与されたクラスであるという点です。
assertComponentAnnotation では AnnotationUtil#hasAnnotationType を使って @Component アノテーションの有無を検査していますが、これは以下のようなソースコードになっています。
public static boolean hasAnnotationType(Class<? extends Annotation> target, Annotation[] annotations) { for (Annotation a : annotations) { if (target == a.annotationType()) { return true; } } for (Annotation a : annotations) { Annotation[] metas = a.annotationType().getAnnotations(); if (metas == null || isTopLevelAnnotations(metas)) { continue; } boolean b = hasAnnotationType(target, metas); if (b) { return true; } } return false; }
つまり、検査対象のアノテーションに付与されたメタアノテーションまで調査しているのですね。これによって、Bean に対して @Component と @SingletonScope のように2つのアノテーションを付与する必要が無くなっています。面白いなー、コレ。これがイマドキなのか・・・。
isTopLevelAnnotations は Java 標準のアノテーションか否かの検査ですが、この検査を行ってループを脱出しているのは処理高速化のためだと思われます。
Lucy のソースコードは全体的に綺麗で読み易いですね!でも↑の " boolean b " って部分はちょっとキライです(笑)。