YmirではSeasar2によるdiconファイルの読み込みにs2-classbuilderというライブラリを使用しており、Seasar2を単独で利用した場合に比べてコンポーネントの読み込みを柔軟に制御することができるようになっています。
具体的には以下のことが実現できるようになっています。
- diconファイルの置き換え
- dicon中の特定のコンポーネントの差し替え
- dicon中の特定のコンポーネントの除去
- diconへのコンポーネント定義の追加
s2-classbuilderのセットアップ
Viliで作成したYmirアプリケーションプロジェクトには、基本的に全てs2-classbuilderが組み込み済みですので、セットアップは不要です。
自分でYmirアプリケーションプロジェクトを構築する場合や、Ymir以外のSeasar2アプリケーションプロジェクトでs2-classbuilderを利用する場合は、次のようにして下さい。
-
クラスパス上に次のようなs2container.diconを配置する:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd"> <components> <component name="dicon" class="org.seasar.cms.classbuilder.impl.RedefinableXmlS2ContainerBuilder" /> <component class="org.seasar.cms.classbuilder.impl.RedefinableResourceResolver" /> </components>
- クラスパス上にs2-classbuilderのJarを配置する。
[注意] Seasar2.4(少なくとも2.4.39までのSeasar2.4)の不具合により、Ymir以外のSeasar2.4系フレームワークとs2-classbuilderを組み合わせた場合に正しく動作しないことがあります。Seasar2.4の不具合を回避するためにはs2-classbuilder-0.0.10以降を使用して下さい。
diconファイルの置き換え
aaa.diconに対してaaa+.diconをクラスパスに配置しておくことで、aaa.diconの代わりにaaa+.diconが読み込まれます。
aaa.dicon:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd"> <components> <component name="bbb" class="com.example.Bbb" /> <component name="ccc" class="com.example.Ccc" /> </components>
aaa+.dicon:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd"> <components> <component name="bbb" class="com.example.Bbb2" /> <component name="ccc" class="com.example.Ccc2" /> </components>
この場合、aaa.diconが以下のような場合と等価になります:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd"> <components> <component name="bbb" class="com.example.Bbb2" /> <component name="ccc" class="com.example.Ccc2" /> </components>
dicon中の特定のコンポーネントの差し替え
aaa.diconにbbbという名前のコンポーネント定義が記述されている場合、bbbのコンポーネント定義を記述したaaa+bbb.diconをクラスパスに配置しておくことで、aaa.dicon中のbbbコンポーネントの定義を差し替えることができます。
aaa.dicon:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd"> <components> <component name="bbb" class="com.example.Bbb" /> <component name="ccc" class="com.example.Ccc" /> </components>
aaa+bbb.dicon:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd"> <components> <component name="bbb" class="com.example.Bbb2" /> </components>
この場合、aaa.diconが以下のような場合と等価になります:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd"> <components> <component name="bbb" class="com.example.Bbb2" /> <component name="ccc" class="com.example.Ccc" /> </components>
インクルード定義やメタ情報定義もaaa.diconに追加されます。
[s2classbuilder-0.0.9以降] なおaaa+bbb.diconにbbb以外のコンポーネント定義が含まれている場合はそれもaaa.diconに追加されます。
[s2classbuilder-0.0.9以降] aaa++.dicon(後述)によって追加されたbbbコンポーネントもaaa+bbb.diconで置き換えることができます。
dicon中の特定のコンポーネントの除去
aaa.diconにbbbという名前のコンポーネント定義が記述されている場合、空のaaa+bbb.diconをクラスパスに配置しておくことで、aaa.dicon中のbbbコンポーネントの定義を除去することができます。
aaa.dicon:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd"> <components> <component name="bbb" class="com.example.Bbb" /> <component name="ccc" class="com.example.Ccc" /> </components>
aaa+bbb.dicon:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd"> <components> </components>
この場合、aaa.diconが以下のような場合と等価になります:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd"> <components> <component name="ccc" class="com.example.Ccc" /> </components>
diconへのコンポーネント定義の追加
aaa.diconに対してaaa++.diconをクラスパスに配置しておくことで、aaa.diconにコンポーネント定義を追加することができます。
aaa.dicon:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd"> <components> <component name="bbb" class="com.example.Bbb" /> <component name="ccc" class="com.example.Ccc" /> </components>
aaa++.dicon:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd"> <components> <component name="ddd" class="com.example.Ddd" /> <component name="eee" class="com.example.Eee" /> </components>
この場合、aaa.diconが以下のような場合と等価になります:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd"> <components> <component name="bbb" class="com.example.Bbb" /> <component name="ccc" class="com.example.Ccc" /> <component name="ddd" class="com.example.Ddd" /> <component name="eee" class="com.example.Eee" /> </components>
aaa++.diconに含まれているインクルード定義やメタ情報定義もaaa.diconに追加されます。また、クラスパス上に複数のaaa++.diconが存在する場合は全てのaaa++.diconの内容が追加されます。なおaaa++.diconにはaaa.diconに含まれるコンポーネントと同じ名前のコンポーネント定義を含めないようにして下さい。
++aaa.diconというファイルがあると、aaa.diconのコンポーネント定義の前にコンポーネント定義が追加されます。
その他
- diconのパス名に「+」が含まれる場合は上記のような振る舞いはしません。例えばaaa+bbb.diconに関して、aaa+bbb+.diconで置き換えるようなことはしません。
- [s2-classbuilder-0.0.8以前] diconファイルの置き換えの場合以外では、includeタグなどの「componentタグ以外のもの」は無視されます。例えばaaa++.diconにincludeタグを書いていたとしても、それはaaa.diconに追加されません。