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);
}
見たいにすれば良いかも。上記Javaは下記のdiconファイルと同じ意味です。
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;
}
}
hoge.diconに相当するJavaは、HogeConfig.javaにする。(diconファイルの拡張子をJavaに変え、先頭を大文字にしてConfigをつける)なんて規約を作って、diconファイルの利用者側から見れば、diconファイルなのかdicon Javaなのか分からないように透過的に扱わせることもできますね。
hoge
ちょっとニーズを聞いてみたい。
includeでなしに同じJavaにある設定なら、下記のようにもっと簡単です。
Aspectの設定はさらに@Traceと短く書くことができます。Seasar2で用意されているInterceptorはアノテーションを使ってTypeSafeに宣言することができます。基本的なルールは、Interceptor名からInterceptorを取り除いて先頭を大文字にしたアノテーションが用意されています。
class AppConfig extends DIConfig {
public Hoge hoge() {
return new HogeImpl();
}@Aspect("traceInterceptor")
public Foo foo() {
FooImpl foo = new FooImpl();
foo.setHoge(hoge());
return foo;
}
}
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;
}
}