S2.3 自動登録とコンテナ階層 (名前空間)

仕事先で、今作成中のシステムに試しに入れて色々動かしてみました。特に問題なく動いてるし、たしかに基盤系以外のdiconファイルはいらなくなることを確認。これ入れたらメンバー楽になるだろうなぁ・・・と思ったのですが・・・、自動設定では定義分割機能やネームスペース機能が使えないっぽいと判明。

大丈夫,ちゃんと使えますよ♪


S2.3 の ComponentAutoRegister は,それ自身のコンテナにコンポーネントを登録します.その他のコンテナにコンポーネントを登録することはできません.
しかし,複数のコンテナを使うことや名前空間を使うことは問題なくできます.
例えば app.dicon

<components>
    <include path="aaa.dicon"/>
    <include path="bbb.dicon"/>
    ・・・

とかしておいて,aaa.dicon では

<components namespace="aaa" >
    <component class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister">
        <initMethod name="addClassPattern">
            <arg>"hoge.aaa"</arg>
            <arg>".*ActionImpl"</arg>
        </initMethod>
        ・・・

そして bbb.dicon では

<components namespace="bbb" >
    <component class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister">
        <initMethod name="addClassPattern">
            <arg>"hoge.bbb"</arg>
            <arg>".*ServiceImpl"</arg>
        </initMethod>
        ・・・

とすることで,hoge.aaa パッケージの 〜ActionImpl クラスは名前空間 aaa のコンテナに,hoge.bbb パッケージの 〜ServiceImpl クラスは名前空間 bbb のコンテナに登録されます.
当然ですが,aaa.diconbbb.dicon はそれぞれが必要な dicon をインクルードすることができますから,

例えば、ある一部の業務では別システムのデータベースに接続する必要があるので、j2ee.diconに設定しているDataSourceとは別のDataSourceオブジェクトを作成する必要があるのですが、このDataSourceや、それを利用するコンポーネントを共通なdiconファイルに定義してしまうと、これらのコンポーネントに対して自動バインディング定義が使えなくなります。

という場合でも大丈夫です.
ある DataSource を定義した dicon (またはそれをインクルードしている dicon) の中にその DataSource を使うコンポーネントを登録する ComponentAutoRegister を記述すればオッケー♪


S2.3 が掲げているのは Less Configuration であって Zero Configuration ではないので (たしか),dicon を全く書かないと考えるのではなく,従来通りコンテナ (dicon) の階層を使ってスコープを管理して,そこに登録したいコンポーネントComponentAutoRegister で引っ張ってくると考えればいいのではないでしょうか.