SMART deploy構成における実装の切り替え

DIコンテナの存在を知ったとき、最初に期待したのは設定ファイル地獄から脱却できるのでは?ということでした。
今までだとあるロジックに2通りのバリエーションを持たせたいといった場合には設定ファイルにフラグを設けて、ロジックの中でそのフラグを見て分岐させるというようなことをやっていたので、設定ファイルに設定すべき項目が膨れ上がってしまっていました。DIコンテナを使えばフラグはロジックのパラメータにしたり、ロジック自体を分けたりして、あとは呼び出す側(サービス)でパラメータや呼び出すメソッドが異なる実装を用意して切り替えれば設定ファイル地獄から脱却できそうな気がしたのです。

そこからSeasar2についていろいろ調べ始め、そしてSMART deploy構成にしたがって開発しようと決めた訳ですが、そうした場合に実装を切り替えるにはどうすればいいのでしょう?例えばHogeServiceというインターフェイスがあった場合、通常はルートパッケージ.service.impl.hogeServiceImplがコンテナに登録されますが、これをdiconファイルによってルートパッケージ.service.impl.hogeServiceImpl2がコンテナに登録されるようにしたいということです。

ネットで軽く情報を漁ってみたもののいい情報を拾えなかったので、ソースをみていろいろ試してみました。結論だけ書くとconvention.diconだけ編集すればOKで

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
	"http://www.seasar.org/dtd/components21.dtd">
<components>
    <component class="org.seasar.framework.convention.impl.NamingConventionImpl">
        <initMethod name="addRootPackageName">
            <arg>"hatena"</arg>
        </initMethod>
        <!-- hogeServiceImpl2が登録されるようにする -->
        <initMethod name="addInterfaceToImplementationClassName">
            <arg>"hatena.service.HogeService"</arg>
            <arg>"hatena.service.impl.HogeServiceImpl2"</arg>
        </initMethod>
    </component>
</components>

のようにしてインターフェース名と実装クラス名の関連を追加します。こうするとhogeServiceImpl2(だけ)がコンテナに追加されるようになりました。

本題とはそれますが、「addInterfaceToImplementationClassName」というメソッド名、このネーミングセンスは大好きです。メソッド名がそのメソッドの内容を的確に語っています。今回はこのネーミングセンスに助けられ、比較的早く当たりをつけることができました。たまに長いメソッド名を嫌って短くしてしまう人がいるのですが、社内では長くてもいいから内容を的確に語るメソッド名をつけるよう啓蒙中です。