S2ClassBuilder
DBFluteとは直接無関係ながらも、同時に利用するととても便利なライブラリを紹介します。
- S2ClassBuilderとは?
- S2ClassBuilderの環境構築
- S2ClassBuilderの使い方
- dbflute.dicon のカスタマイズ
- ApplicationBehavior では必須
- Exampleのススメ
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があります。