<componentRef> 要素は <componentRefList> 要素の子で、当該コンポーネントによって参照されるコンポーネントを指定します。この要素は、暗黙的に PUBLIC アクセスとなります。
<componentRef> 要素には子要素があり、それらは次の順序で出現する必要があります。
<type> – 参照先コンポーネントがインスタンスとなるべきコンポーネント型を指定します。これは、包含する <componentRefList> によって指定されるコンポーネント型のインスタンスでなければなりません。
この要素はオプションです。この要素を使用する場合、この要素は <componentRef> 要素 1 つにつき 1 回しか出現できません。
この要素を指定しないと、包含する <componentRefList> によって指定されたコンポーネント型が使用されます。
<argList> – オプション要素で、参照先コンポーネントのインストール時にそれらのコンポーネント変数設定として使用される値の一覧。
この要素を使用する場合、この要素は <componentRef> 要素の子としてのみ 1 回しか出現できません。
<component> – 必須要素で、参照先コンポーネントを指定します。この要素は、抽象 <componentRef> 要素では使用できません。
デフォルトでは、派生コンポーネントはそのベースコンポーネントのすべてのコンポーネント参照を継承します。
ベースコンポーネントの <componentRefList> 要素が最終でない場合、派生コンポーネントはベースコンポーネントから継承されたコンポーネント参照に使用されていない名前を使用して、別のコンポーネント参照を定義できます。
派生コンポーネントは、同じ名前を持つコンポーネント参照を宣言し直すことにより、非最終継承コンポーネント参照のコンポーネント参照をオーバーライドできます。コンポーネント参照がオーバーライドされた場合には、コンポーネント参照の全コンテンツを宣言し直す必要があります。オーバーライドする installMode は、オリジナルの参照のものと同じでなければなりません。オーバーライドする <type> 要素は、オリジナルの型のインスタンスでなければなりません。オーバーライドする <argList> 要素は、オリジナルのものと結合されます。詳細は、「<argList> 要素」を参照してください。<component> 要素は、オーバーライドする参照が非抽象の場合にのみ指定されます。
コンポーネント参照をオーバーライドすると、ベースコンポーネント内のものも含め、そのコンポーネント参照の使用はすべてオーバーライド値に評価されます。
派生コンポーネントを非抽象と宣言する場合、ベースコンポーネントによって宣言された抽象的なコンポーネント参照は、派生コンポーネントによってオーバーライドする必要があります。
<componentRef> 要素には次の属性があります。
modifier – modifierEnum 型のオプション属性で、コンポーネント参照のオーバーライド要件を指定します。この属性は次の値を取ります。
ABSTRACT – <componentRef> 要素の <component> 子要素は省略されるため、非抽象派生コンポーネントによって指定する必要があります。<componentRef> を抽象と宣言できるのは、そのコンポーネントも抽象と宣言されている場合だけです。非抽象 <componentRef> は、<component> 要素を宣言する必要があります。
FINAL – <componentRef> は派生コンポーネントによってはオーバーライドできません。
この属性を指定しない場合、派生コンポーネントはコンポーネント参照をオーバーライドするかどうかを選択できます。
name – identifier 型の必須属性で、参照先コンポーネントのローカル名を指定します。この名前は、すべての兄弟 <componentRef> 要素の中で一意となるようにする必要があります。
installMode – オプション属性で、参照先コンポーネントをインストールし、その後対象設定を行う方法を指定します。この属性を指定しないと、値は NESTED になります。
この属性は次の値を取ります。
TOPLEVEL – 参照先コンポーネントが TOPLEVEL としてインストールされている場合、1 つのプランで直接インストールされたかのように、ほかの任意のコンポーネントがそのコンポーネントを使用できます。
NESTED – 参照先コンポーネントが NESTED としてインストールされている場合、そのインストールの範囲は参照元コンポーネントのインストール範囲に暗黙に限定されます。そのサービスも参照元コンポーネントでしか利用できません。
論理的に、入れ子になった参照先コンポーネントは参照元コンポーネントが要求する細かな機能単位を定義しますが、この機能はほかのコンポーネントに役立つことはありません。一方、最上位の参照先コンポーネントは参照元コンポーネントが使用するサービスを定義しますが、ほかのコンポーネントもこのサービスを使用できます。
入れ子になった参照先コンポーネントの有効期間は、参照元コンポーネントの有効期間と暗黙に同じになります。入れ子になった参照先コンポーネントのインストールは参照元コンポーネントのインストールの最中にしか行えず、参照元コンポーネントがアンインストールされる際に暗黙にアンインストールされます。これに対し、最上位の参照先コンポーネントの有効期間は、参照元コンポーネントの有効期間には拘束されていません。最上位の参照先コンポーネントは、参照元コンポーネントのインストール時に参照元コンポーネントによってインストールすることができます。また、最上位の参照先コンポーネントがすでにインストールされている場合は、ほかの方法でインストールすることもできます。参照元コンポーネントがアンインストールされる場合、明示的に参照元コンポーネントによってアンインストールされない限り、最上位の参照先コンポーネントはインストールされたままとなります。 また、ほかのコンポーネントも参照元コンポーネントをアンインストールできます。
<targetRef> 要素を定義するコンポーネントを参照するには、TOPLEVEL <componentRef> を使用する必要があります。NESTED <componentRef> は使用できません。
<argList> 要素は <componentRef> 要素の子で、参照先コンポーネントのインストール時に、そのコンポーネント変数設定として使用される値の一覧を指定します。この <argList> の書式は、 <call> ステップの <argList> 子要素の書式と同じです。詳細は、「<call> ステップ」を参照してください。
参照が ABSTRACT の場合、<argList> 要素の各属性は、参照先コンポーネントにおけるコンポーネント変数または宣言された型を指定します。<argList> 要素の属性の値は、参照先コンポーネントのインストール時に、指定されたコンポーネント変数に使用されるオーバーライド値です。
コンポーネント参照が派生コンポーネントによってオーバーライドされる場合、ベースコンポーネントおよび派生コンポーネントの <argList> 要素は、効率よく結合されます。この結合は、ベースコンポーネントの <argList> のコンテンツを参照先コンポーネントに適用し、続いて派生コンポーネントの <argList> を適用することによって行われます。ベースコンポーネント参照の <argList> を処理する場合、考慮されるのはベースコンポーネント参照の宣言された型で定義された変数だけです。
<argList> で指定されていないコンポーネント変数は、インストール時にそれらのデフォルト値を使用します。<argList> が指定されていない場合、参照先コンポーネントがインストールされ、またそのすべての変数のデフォルト値を使用します。<argList> で指定される参照先コンポーネントの変数は、参照元コンポーネントからアクセス可能でなければなりません。また、これらの変数はアクセスモード FINAL ではなく、PUBLIC または PROTECTED で宣言されていなければなりません。
最上位の参照先コンポーネントの場合、<argList> 要素が使用されるのは参照先コンポーネントが参照元コンポーネントによってインストールされている場合だけです。参照先コンポーネントは、ほかの方法でインストールされていることもあります。この場合、<argList> は意味を持ちません。
<component> 要素は <componentRef> 要素の子で、参照先コンポーネントを特定します。この要素の構造は、host 属性が許可されない点を除き、<component> リポジトリコンポーネントターゲッターと同じです。参照先コンポーネントバージョンは、包含コンポーネントの保存時にリポジトリ内に存在する必要があります。
version 属性を指定しないと、version は包含コンポーネントの保存時に存在する参照先コンポーネントの最新バージョンに解決されます。参照先コンポーネントのバージョンが存在しない場合、保存時のエラーが発生します。包含コンポーネントが保存されると、当該コンポーネントが参照するすべてのコンポーネントのバージョンがロックされます。参照先コンポーネントは、コンテナコンポーネントの新しいバージョンを作成しない限り変更できません。