特定の IoC コンテナに依存しないようにする 対応したいコンテナ Seasar2 Guice Spring (Guice が Spring と連携できるので、必須ではないかも) PicoContainer (趣味) 要検討 : IoC コンテナなしでも動作するようにするか? いま、Seasar2 に依存している箇所 ログ出力 (Logger) JavaBeans のメタデータ (BeanDesc) コンポーネントのルックアップ (S2Container) コンポーネントのインジェクション (*.dicon) JSON (JSONSerializer) Cubby 自身のテストケース (S2TestCase) そのためにどうするか? ログ出力 slf4j に置き換える JavaBeans のメタデータ (BeanDesc) もう一段階抽象化して、実装を切り替えられるようにする *1 Seasar2 の場合は public フィールド対応のためにも BeanDesc を使ってプロパティを操作 それ以外のコンテナは Introspector など java.beans のクラスによってプロパティを操作 コンポーネントのルックアップ (S2Container) もう一段階抽象化して、実装を切り替えられるようにする *1 コンポーネントのインジェクション (*.dicon) cubby.dicon や routing.dicon に登録されているコンポーネントをどう扱うか? 方法1. コンテナ経由ではなく、ふつうに new して使う 方法2. 必要なところは置き換え可能にしておく *1 JSON (JSONSerializer) もう一段階抽象化して、実装を切り替えられるようにする *1 S2 を使うときでも Jsonic や GSON を使いたいかもしれないのでパッケージングは注意 Cubby 自身のテストケース (S2TestCase) リファクタもからめてがんばる そろそろ JUnit4 でいいよね? モックには EasyMock を使う *1 実装を切り替える方法 Java6 の ServiceLoader のようなものを作って jar を入れ替えるだけで切り替えられたらいい 例 : S2 と Guice で IoC コンテナ (たとえば org.seasar.cubby.container.Container) の実装を切り替える場合 cubby-s2.jar 中の META-INF/cubby に org.seasar.cubby.container.Container というファイルを作る その中には実装クラスの FQCN を書いておく org.seasar.cubby.s2.container.S2ContainerImpl cubby-guice.jar 中の META-INF/cubby に org.seasar.cubby.container.Container というファイルを作る その中には実装クラスの FQCN を書いておく org.seasar.cubby.s2.container.GuiceContainerImpl こうしておくと、クラスパスにどちらの jar があるかで IoC コンテナを切り替えられる。 両方の jar があったら例外を投げるようにする AOP を使わない AOPでアクションの初期化、バリデーションを実行するのではなく、拡張ポイントを作ってプラグイン形式で処理を追加する。 注意:アクションメソッドから別のアクションメソッドを呼び出したとき、バリデーションやパラメータのバインドがされなくなる。 @Deprecated の扱い 1.1.x 時点で @Deprecated が付いたクラスやメソッドを削除 2.0.0 にするときに要らないクラスやメソッドは @Deprecated をつけるか? いらないんじゃね?