-S20: メーカー研究所

これまでは、設定XMLが常にひとつのファイルでした。Seasar2は設定XMLを分割する機能を持っています。また、設定XMLを分割すると、ファイル毎(正確には<components>エレメント毎)に名前空間を定義することができます。

list20-1. 名前空間を利用したHighway.java修正版
package tutorial.org.seasar.console;
import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.factory.S2ContainerFactory;
public class Highway {
  private static String PATH = "tutorial/org/seasar/console/car.xml";
  public static void main(String[] args) {
    S2Container container = S2ContainerFactory.create(PATH);
    Car car = null;
    car = (Car)container.getComponent("car:paintedCar");
    car.run();
    car = (Car)container.getComponent("other:paintedCar");
    car.run();
  }
}

list20-1ではクライアントからコンポーネントを呼び出すのに名前空間を用いてコンポーネント指定を行っています。「car:paintedCar」の「car」および、「other:paintedCar」の「other」が名前空間です。コロンで区切られて続く「paintedCar」がコンポーネント名となります。

list20-2. 親設定XMLとなるcar.xml修正版
<?xml version="1.0" encoding="UTF-8"?>
<components namespace="car">
  <include path="tutorial/org/seasar/console/other.xml"/>
  <component name="paintedCar" class="tutorial.org.seasar.console.PaintedCar">
    <property name="bodyColor">'red'</property>
  </component>
</components>

list20-2は親の設定XMLです。このファイルがlist20-1でS2ContainerFactoryで参照されています。分割された子の設定XMLは、<include>エレメントにて指定されます。<include>エレメントの必須属性であるpathには、子設定XMLのリソースパスを設定します。

list20-3. 子設定XMLとなるother.xml
<?xml version="1.0" encoding="UTF-8"?>
<components namespace="other">
  <component name="paintedCar" class="tutorial.org.seasar.console.PaintedCar">
    <property name="bodyColor">'yellow'</property>
  </component>
</components>

list20-3は子の設定XMLです。こちらでも親の設定XMLに登録したコンポーネントと名前が同じ、「paintedCar」が登録されています。子のXMLに定義されたコンポーネントは親のXMLに文字通りインクルードされますので、普通にcontainer.getComponent("paintedCar");ではTooMachRegistRuntimeExceptionが発生してしまいます。しかし、親設定XMLは「car」、子設定XMLは「other」とそれぞれの<components>エレメントのnamespace属性にて設定していますので、コンポーネント名の前に「car:」や「other:」と名前空間接頭辞をつけることで明確に区別されます。実行結果は以下のとおりです。

My body color is red
My body color is yellow

car名前空間のほうではプロパティを「red」と設定して、otherのほうでは「yellow」と設定していましたので、きちんと、名前空間で区別してしてコンポーネント取得していることが確認できました。