DIコンテナを作っています。相談に乗ってくれる人を探しています。

http://code.google.com/p/freja/
できることは少ないが覚えるべきことも少ない。最低限動かすなら3つだけで十分。

  1. インタフェイスと、その実装クラスを用意する
  2. 実装クラスに @Component アノテーションを付ける
  3. インタフェイスの Class オブジェクトで get する
public class FrejaSample {
    public void main(String[] args) {
        Animal animal = Freja.get(Animal.class);
        animal.bark();
    }

    private interface Animal {
        public void bark();
    }

    @Component
    private static class Cat implements Animal {
        public void bark() {
            System.out.println("meow meow");
        }
    }
}

これだけ。利点は幾つか。

  1. 既存のオブジェクトに後付で DI する方法もある。テストケースへの DI も、変なクラス継承など無しにメソッド1発
  2. コンポーネントのスコープが意外と豊富。メソッド呼び出し1回の間だけ生存するコンポーネントも作成できる

残念ながら、懸念点も幾つか。

  1. アノテーションだけで出来ることは、コンポーネント登録と、フィールドインジェクションのみ
  2. マイクロベンチマーク取ってみたら、速度が S2 の十分の一程度
  3. 1個の jar だけで完結させようとしたら、外部の有意義なライブラリ*1が全く使えなくなった

早くも行き詰まり感を感じていたり……スランプなのかなぁ。今の自分だけでは先に進めそうにないので、こんな変なものの相談に乗ってくれる人をさりげなく募集していたりします。

*1:javassist とか aopalliance とか