-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」と設定していましたので、きちんと、名前空間で区別してしてコンポーネント取得していることが確認できました。