XInclude
目次
XInclude (XML Inclusion) は,複数の XML ドキュメントを一つの XML ドキュメントに統合するための仕様です. Seasar2.4 で導入された XInclude のサポートにより,複数の dicon ファイルを一つの dicon ファイルのように扱うことが可能になります.
XInclude を利用するには,Java5 以降でかつ,XInclude に対応した XML パーサが必要です.Java5 にバンドルされている
XML パーサは XInclude に対応しています.
Teeda や S2JSF,Mayaa 等にバンドルされている Xerces 2.6.2 は XInclude に対応していません.Xerces
2.6.2 は Tomcat 5.0 でも利用されています.これらの環境で XInclude を使用するには次の設定が必要です.
META-INF/services ディレクトリを作成し,javax.xml.parsers.SAXParserFactory というファイルを作成し,以下の内容を記述します (SunのJDK/JREの場合).
com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl
XInclude を使って他の 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
xmlns:xi="http://www.w3.org/2001/XInclude"
>
<xi:include href="/foo.dicon"/>
<xi:include href="/bar.dicon"/>
</components>
- 文書型宣言で Seasar2.4 の DTD を指定します.
<components> 要素で XInclude の名前空間を宣言します.
<components> 要素の内容に <xi:include> 要素を記述します.href 属性で取り込む dicon ファイルのパスを指定します.パスの先頭は必ずスラッシュ ('/') にしてください.
これにより,foo.dicon と bar.dicon の内容 (<components> 要素の子要素) が取り込まれます. <xi:include> 要素は <component> 要素と混在して記述することができます.
foo.dicon と bar.dicon が次の内容だった場合,
foo.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="foo1">"Foo1"</component>
<component name="foo2">"Foo2"</component>
</components>
bar.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="bar1">"Bar1"</component>
<component name="bar2">"Bar2"</component>
</components>
最初に示した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
xmlns:xi="http://www.w3.org/2001/XInclude"
>
<component name="foo1">"Foo1"</component>
<component name="foo2">"Foo2"</component>
<component name="bar1">"Bar1"</component>
<component name="bar2">"Bar2"</component>
</components>
Seasar2 では,以前から dicon ファイルを分割することができるように <include> 要素を利用することができました.
<include> と XInclude (<xi:include>) は一見似ているようですが,実際には大きく異なります.
次のように <include> を利用すると,それぞれの dicon ファイルを読み込んだ S2 コンテナが合計 3 つインスタンス化されます.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
"http://www.seasar.org/dtd/components24.dtd"
>
<components
xmlns:xi="http://www.w3.org/2001/XInclude"
>
<include path="foo.dicon"/>
<include path="bar.dicon"/>
</components>
親となる dicon に定義されたコンポーネントからは foo.dicon と bar.dicon に定義されたコンポーネントが見えます (DI の対象となる)が, foo.dicon に定義されたコンポーネントからは 親の dicon に定義されたコンポーネントも bar.dicon に定義されたコンポーネントも見えません (DI の対象とならない). bar.dicon に定義されたコンポーネントからは 親の dicon に定義されたコンポーネントも foo.dicon に定義されたコンポーネントも見えません (DI の対象とならない).
一方,XInclude を利用した場合には,親の dicon も,foo.dicon および bar.dicon も一つの S2 コンテナに読み込まれるため, どこの dicon に定義したコンポーネントからであっても他の dicon に定義されたコンポーネントが見えます (DI の対象となる).
<include> は dicon ファイルを論理的に分割する機能で,S2 コンテナを階層化し,可視性をもたらします.
一方 XInclude (<xi:include>) は dicon ファイルを物理的に分割する機能で,S2コンテナの階層や可視性には影響を与えません.
Seasar2.4 の SMART deploy を利用すると,ネーミングルールに従って多くのコンポーネントがルートの (app.dicon を読み込んでいる) S2 コンテナに自動登録されます. SMART deploy で自動登録されたコンポーネントを DI してもらいたいコンポーネントもルートの S2 コンテナに存在する必要があるため,app.dicon に定義することになります. しかし,これでは大規模なシステムの場合,app.dicon が肥大化する可能性があります.
そこで XInclude を使用して dicon ファイルを (物理的に) 分割することにより,dicon ファイルを肥大化することなくルートコンテナに登録するコンポーネントの数を増やすことができます.
|