http://herringroe.googlecode.com/svn/trunk/herringroe/src/sandbox/main/java/jp/herringroe/di/
まずはalpha版ってところでしょうか。まだAOP等をサポートしていませんが、DIコンテナとしての基本的な機能をサポートしたものを作ってみました。
- コンストラクタインジェクション
- セッターメソッドインジェクション
- シングルトンスコープ
- プロトタイプスコープ
- コードによる設定
大体こんな感じの機能でよくある感じだと思いますが、これからどんどん機能追加をしていく予定です。作ったDIコンテナではどんな感じでコードが書けるのかを実例で示してみます。
まずはインターフェイス郡。
package jp.herringroe.di.test;
public interface Greeting {
void sayGreeting();
}
package jp.herringroe.di.test;
public interface GreetingClient {
void doGreeting();
}
そして実装郡。上記インターフェイスの実装です。
package jp.herringroe.di.test;
public class GoodbyeGreeting implements Greeting {
public void sayGreeting() {
System.out.println("Goodbye");
}
}
package jp.herringroe.di.test;
public class HelloGreeting implements Greeting {
public void sayGreeting() {
System.out.println("hello");
}
}
package jp.herringroe.di.test;
public class GreetingClientImpl implements GreetingClient {
private Greeting greeting;
public GreetingClientImpl(Greeting greeting) {
this.greeting = greeting;
}
public void doGreeting() {
greeting.sayGreeting();
}
}package jp.herringroe.di.test;
public class GreetingClientImpl2 implements GreetingClient {
private Greeting greeting;
public void setGreeting(Greeting greeting) {
this.greeting = greeting;
}
public void doGreeting() {
greeting.sayGreeting();
}
}
これまではよくあるDIコンテナのサンプルコードのパターンです。インターフェイスと実装がある状態です。そして次に設定用クラスです。
package jp.herringroe.di.test;
import jp.herringroe.di.configuration.ConfigurationContext;
import jp.herringroe.di.helper.DefaultConfiguration;
public class GreetingConfiguration extends DefaultConfiguration {
public void configure(ConfigurationContext context) {
context.register(GreetingClientImpl2.class);
context.register(GoodbyeGreeting.class);
}
}
設定コードでは実装クラスを指定して登録していますが、実はパッケージ単位での自動登録もサポート予定です。自動登録機能を利用すると、クラスとクラスの依存関係を、新規クラスを作るたびに設定する必要はありません。そして最後に利用コードです。
package jp.herringroe.di.test;
import jp.herringroe.di.Container;
import jp.herringroe.di.ContainerFactory;
public class Test {
public static void main(String[] args) {
Container container = ContainerFactory
.createContainer(new GreetingConfiguration());
GreetingClient client = container.getInstance(GreetingClient.class);
client.doGreeting();
}
}
例えばGoodbyeGreetingをHelloGreetingに変更したり、GreetingClientImpl2をGreetingClientImplに変更しても最後のコードは一切変更する必要はありません。極一般的なDIコンテナの要件は満たしているといっても問題ないレベルだと思います。
今後の課題はまだまだ沢山ありますが、リリースって段階になったら再アナウンスしたいと思います。