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 " って部分はちょっとキライです(笑)。