S2ClassBuilder

DBFluteとは直接無関係ながらも、同時に利用するととても便利なライブラリを紹介します。

S2ClassBuilderとは?

Seasar(S2Container)のDI設定機能(dicon)を拡張 するライブラリです。

例えば、ライブラリに組み込まれた dicon をアプリ側で拡張することができます。j2ee.dicon に対して、アプリ独自のコンポーネントを追加したり、(アプリ内の)共通プロジェクトの dicon に対して、そのアプリでしか利用しないコンポーネントを追加したり、同じ namespace に対して、別の dicon ファイル上でコンポーネントを指定 することができます。

e.g. foo.dicon にコンポーネントを追加する @Directory
library
 |-src/main/resources/foo.dicon // fooLogic のみ定義されている

app1
 |-src/main/resources/foo++.dicon // barLogic のみ定義されている

// app1 で Seasar を起動し、foo.dicon を読み込むと、
// fooLogic と barLogic が登録される
// (内部的にマージされる)

S2ClassBuilderの環境構築

s2container.dicon に S2ClassBuilder のクラスを定義します。

e.g. s2container.dicon に S2ClassBuilder のクラスを定義する @s2container.dicon
<components>
    ...

    <component name="dicon" class="org.seasar.cms.classbuilder.impl.RedefinableXmlS2ContainerBuilder" />
    <component class="org.seasar.cms.classbuilder.impl.RedefinableResourceResolver" />
</components>

s2-classbuilder.jar をアプリの実行環境のクラスパスに含めます。jarファイルは Maven 経由、もしくは、Maven リポジトリから直接ダウンロードして取得します。

e.g. S2ClassBuilder-0.0.11のdependencyを定義 @pom.xml
<dependency>
    <groupId>org.seasar.cms.s2-classbuilder</groupId>
    <artifactId>s2-classbuilder</artifactId>
    <version>0.0.11</version>
</dependency>

S2ClassBuilder は Ymir に依存しない

S2ClassBuilder は Ymir に組み込まれて利用されることが多いですが、特に Ymir には依存しておらず、単独で利用することができます。

S2ClassBuilderの使い方

主な機能は以下の通りです。

完全な上書き
foo+.dicon に定義されたコンポーネントが有効になる
特定コンポーネントの差し替え
foo+bar.dicon に bar を定義することで、bar コンポーネントが差し替わる
特定コンポーネントの除去
foo+bar.dicon に何も定義しないことで、bar コンポーネントが削除される
コンポーネントの追加
foo++.dicon に定義されたコンポーネントが追加される。"++" が後ろに付くと、最後に定義されたコンポーネントと同じ扱いとなり、 逆に先に付くと(++foo.dicon)、最初に定義されたコンポーネントと同じ扱いで追加される。 (つまり、初期化順序の調整が可能である)

dbflute.dicon のカスタマイズ

dbflute.dicon を調整するために、dependencyInjectionMap.dfprop が用意されていますが、要件次第では、このプロパティを利用しなくても S2ClassBuilder で実現できることがあります。

ApplicationBehavior では必須

DBFluteの機能の ApplicationBehavior では、S2ClassBuilder を利用していることを前提としています。ClientBehavior は大規模開発を想定した機能ですが、大規模開発であればなおさら S2ClassBuilder が(その開発の別の場面で)役に立つでしょう。

Exampleのススメ

dbflute-sastruts-example では、実際に S2ClassBuilder を利用したExampleがあります。

DBFlute Example - 他のフレームワーク