コンポーネントの詳細
前ページでは、SCAアセンブリの高レベルな概念(コンポーネント同士の組み合わせ)について説明した。続いて、低レベルな概念として、個々のコンポーネントの構造/実装について説明する。コンポーネントにフォーカスして拡大した図を以下に示す。
コンポーネントとは、前ページでも説明したとおり、様々な実装技術を用いて実際に動く業務ロジックを記述する箇所である。上の図はコンポーネントの重要な性質を簡潔に表している。図で示されている構成要素については以下を参照していただきたい。
- コンポーネントはサービスを提供する
- コンポーネントは他のサービスへのリファレンスを持つことができる
- コンポーネントには、プロパティと呼ばれる、外部から設定可能な値がある。単純な文字列や数値から複雑な型まで、XML Schemaで表現できる型を設定することができる。これも、Javaで書かれたコンポーネントであればランタイムによる依存性注入を利用できる
- コンポーネントはインプリメンテーション(実装)を持ち、インプリメンテーションが実際の業務ロジックを実行する。多岐に渡る実装技術を使用することができ、プレーンなJavaクラスはもちろんのこと、EJBのSession BeanやSpringフレームワーク、Webサービス、BPEL、C++も利用できる。Tuscanyではさらに、JRuby、JavaScript(Rhino)による実装も行えるよう拡張されている
SCDL
以上が、SCAを構成する要素についての概略だ。こうした個々の要素を基に、コンポーネントを組み合わせてSCAアセンブリを構築するわけだが、SCAアプリケーションの構造を表すにはSCDL(Service Component Definition Language)と呼ばれるXMLベースの言語が使用される。
SCDLは、ここまで説明した概念を素直にXMLにマッピングしたものと言え、SCAアセンブリについてある程度理解していれば記述は容易だ。例えば、コンポジット内にコンポーネントがある、コンポジットがインタフェースを指定してサービスを公開する、あるコンポジットが別のコンポジットが公開しているサービスを参照(リファレンス)する、という図式を表すためのSCDLは以下のようになる。
<?xml version="1.0"?>
<composite name="">
<service>
<interface />
</service>
<component>
<implementation />
</component>
<reference>
<interface />
</reference>
</composite>
もう少し具体的な例を見ていただこう。以下に例題3つとそれに対応する図/SCDLを示す。図とコードを見比べて理解を深めていただきたい。ちなみに、図からはインプリメンテーションの記述を省略している。
例1: コンポジットA内にコンポーネントXが存在している。コンポーネントXはJavaクラスXImplによって実装されている
図3: 例1の概念図 |
<?xml version="1.0"?>
<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
name="A">
<component name="X">
<implementation.java class="XImpl" />
</component>
</composite>
例2: コンポジットA内にコンポーネントXとYが存在している。XはYに対して依存(参照)しており、参照名は「y」である
<?xml version="1.0"?>
<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
name="A">
<component name="X">
<implementation.java class="XImpl" />
<reference name="y" target="Y" />
</component>
<component name="Y">
<implementation.java class="YImpl" />
</component>
</composite>
例3: コンポジットA内にコンポーネントXが存在し、それをサービス「XService」として公開する。サービスインタフェースはJavaインタフェースXInterfaceとする
<?xml version="1.0"?>
<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
name="A">
<service name="XService">
<interface.java interface="XInterface" />
<reference>X</reference>
</service>
<component name="X">
<implementation.java class="XImpl" />
<reference name="y" target="Y" />
</component>
</composite>