ひがやすを技術ブログ

電通国際情報サービスのプログラマ

DIの設定をJavaで

以前、Seasar2の設定をJavaでかけるようにするってのをSeasar2のコミッタMLで提案したことがあるのですが、小林さんに却下されました(笑)。
個人的には、Springの案は悪くないと思っています。
http://blog.interface21.com/main/2006/11/28/a-java-configuration-option-for-spring/
Seasar2の場合は、上記に加えて、includeをどのように扱うかが問題ですが、DIContainer.javaというインターフェースを用意して


interface DIContainer {
T getComponent(Class clazz);
T getComponent(Class clazz, String name);
}
使う側では

class AppConfig extends DIConfig {
private DIContainer hogeDicon = include("hoge.dicon");

public Foo foo() {
FooImpl foo = new FooImpl();
foo.setHoge(hogeDicon.getComponent(Hoge.class, "hoge");
return foo;
}
}

見たいにすれば良いかも。上記Javaは下記のdiconファイルと同じ意味です。




hoge


hoge.diconに相当するJavaは、HogeConfig.javaにする。(diconファイルの拡張子をJavaに変え、先頭を大文字にしてConfigをつける)なんて規約を作って、diconファイルの利用者側から見れば、diconファイルなのかdicon Javaなのか分からないように透過的に扱わせることもできますね。
ちょっとニーズを聞いてみたい。
includeでなしに同じJavaにある設定なら、下記のようにもっと簡単です。

class AppConfig extends DIConfig {

public Hoge hoge() {
return new HogeImpl();
}

@Aspect("traceInterceptor")
public Foo foo() {
FooImpl foo = new FooImpl();
foo.setHoge(hoge());
return foo;
}
}

Aspectの設定はさらに@Traceと短く書くことができます。Seasar2で用意されているInterceptorはアノテーションを使ってTypeSafeに宣言することができます。基本的なルールは、Interceptor名からInterceptorを取り除いて先頭を大文字にしたアノテーションが用意されています。
includeを使う場合でも、相手がJavaだと分かっているなら、次のようにTypeSafe(hoge.diconという文字列でなく)に書けますね。

class AppConfig extends DIConfig {
private HogeConfig hogeConfig = include(HogeConfig.class);

public Foo foo() {
FooImpl foo = new FooImpl();
foo.setHoge(hogeConfig.hoge());
return foo;
}
}