components.xml ファイルはプロパティ設定よりパワフルです。次を行うことができます。
@Name アノテーションが付けられ、Seam のデプロイメントスキャナーで検出されたアプリケーションコンポーネントや組み込みコンポーネントなど自動的にインストールされているコンポーネントの設定を行います。
Seam コンポーネントとして @Name アノテーションが付かないクラスをインストールします。別々の名前で複数回インストールが可能なインフラストラクチャコンポーネントに対して最も役立ちます (たとえば、 Seam 管理永続コンテキストなど)。
@Name アノテーションは付いているが、そのコンポーネントはインストールしないことを示す @Install アノテーションが付いているためデフォルトではインストールされないコンポーネントをインストールします。
コンポーネントのスコープを無効にします。
components.xml ファイルは次の 3 つの異なる場所のいずれかに置くことができます。
コンポーネントにデフォルトではインストールしないことを示している @Install アノテーションがない限り、デプロイメントスキャナーが seam.properties ファイルまたは META-INF/components.xml ファイルを持つ @Name アノテーション付きのクラスを見つけた場合、Seam コンポーネントはインストールされます。components.xml ファイルはアノテーションを無効にしなければならない特殊なケースを処理します。
例えば次の components.xml ファイルは jBPM をインストールします。
<components xmlns="http://jboss.com/products/seam/components"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:bpm="http://jboss.com/products/seam/bpm">
<bpm:jbpm/>
</components>
<components xmlns="http://jboss.com/products/seam/components"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:bpm="http://jboss.com/products/seam/bpm">
<bpm:jbpm/>
</components>
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
次の例も jBPM をインストールします。
<components>
<component class="org.jboss.seam.bpm.Jbpm"/>
</components>
<components>
<component class="org.jboss.seam.bpm.Jbpm"/>
</components>
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
この例は 2 種類の異なる Seam 管理永続コンテキストをインストールして設定します。
<components xmlns="http://jboss.com/products/seam/components"
xmlns:persistence="http://jboss.com/products/seam/persistence">
<persistence:managed-persistence-context name="customerDatabase"
persistence-unit-jndi-name="java:/customerEntityManagerFactory"/>
<persistence:managed-persistence-context name="accountingDatabase"
persistence-unit-jndi-name="java:/accountingEntityManagerFactory"/>
</components>
<components xmlns="http://jboss.com/products/seam/components"
xmlns:persistence="http://jboss.com/products/seam/persistence">
<persistence:managed-persistence-context name="customerDatabase"
persistence-unit-jndi-name="java:/customerEntityManagerFactory"/>
<persistence:managed-persistence-context name="accountingDatabase"
persistence-unit-jndi-name="java:/accountingEntityManagerFactory"/>
</components>
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
この例も 2 種類の異なる Seam 管理永続コンテキストをインストールして設定します。
<components>
<component name="customerDatabase"
class="org.jboss.seam.persistence.ManagedPersistenceContext">
<property name="persistenceUnitJndiName">
java:/customerEntityManagerFactory
</property>
</component>
<component name="accountingDatabase"
class="org.jboss.seam.persistence.ManagedPersistenceContext">
<property name="persistenceUnitJndiName">
java:/accountingEntityManagerFactory
</property>
</component>
</components>
<components>
<component name="customerDatabase"
class="org.jboss.seam.persistence.ManagedPersistenceContext">
<property name="persistenceUnitJndiName">
java:/customerEntityManagerFactory
</property>
</component>
<component name="accountingDatabase"
class="org.jboss.seam.persistence.ManagedPersistenceContext">
<property name="persistenceUnitJndiName">
java:/accountingEntityManagerFactory
</property>
</component>
</components>
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
この例はセッションスコープの Seam 管理永続コンテキストを作成します (実際にはお勧めしません)。
<components xmlns="http://jboss.com/products/seam/components"
xmlns:persistence="http://jboss.com/products/seam/persistence">
<persistence:managed-persistence-context
name="productDatabase" scope="session"
persistence-unit-jndi-name="java:/productEntityManagerFactory"/>
</components>
<components xmlns="http://jboss.com/products/seam/components"
xmlns:persistence="http://jboss.com/products/seam/persistence">
<persistence:managed-persistence-context
name="productDatabase" scope="session"
persistence-unit-jndi-name="java:/productEntityManagerFactory"/>
</components>
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
<components>
<component name="productDatabase" scope="session"
class="org.jboss.seam.persistence.ManagedPersistenceContext">
<property name="persistenceUnitJndiName">
java:/productEntityManagerFactory
</property>
</component>
</components>
<components>
<component name="productDatabase" scope="session"
class="org.jboss.seam.persistence.ManagedPersistenceContext">
<property name="persistenceUnitJndiName">
java:/productEntityManagerFactory
</property>
</component>
</components>
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
永続コンテキストなど基盤となるオブジェクトには auto-create オプションが一般的に使用され、@In アノテーションを使うときに明示的に create=true を指定する必要がありません。
<components xmlns="http://jboss.com/products/seam/components"
xmlns:persistence="http://jboss.com/products/seam/persistence">
<persistence:managed-persistence-context
name="productDatabase" auto-create="true"
persistence-unit-jndi-name="java:/productEntityManagerFactory"/>
</components>
<components xmlns="http://jboss.com/products/seam/components"
xmlns:persistence="http://jboss.com/products/seam/persistence">
<persistence:managed-persistence-context
name="productDatabase" auto-create="true"
persistence-unit-jndi-name="java:/productEntityManagerFactory"/>
</components>
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
<components>
<component name="productDatabase"
auto-create="true"
class="org.jboss.seam.persistence.ManagedPersistenceContext">
<property name="persistenceUnitJndiName">
java:/productEntityManagerFactory
</property>
</component>
</components>
<components>
<component name="productDatabase"
auto-create="true"
class="org.jboss.seam.persistence.ManagedPersistenceContext">
<property name="persistenceUnitJndiName">
java:/productEntityManagerFactory
</property>
</component>
</components>
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
<factory> 宣言は値バインディング式もしくはメソッドバインディング式を指定し、 これが最初に参照されたときにコンテキスト変数の値を初期化します。
<components>
<factory name="contact" method="#{contactManager.loadContact}"
scope="CONVERSATION"/>
</components>
<components>
<factory name="contact" method="#{contactManager.loadContact}"
scope="CONVERSATION"/>
</components>
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
次のように Seam コンポーネントの エイリアス (別名) が生成可能です。
<components>
<factory name="user" value="#{actor}" scope="STATELESS"/>
</components>
<components>
<factory name="user" value="#{actor}" scope="STATELESS"/>
</components>
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
よく使用される式に対してもエイリアスを作成できます。
<components>
<factory name="contact" value="#{contactManager.contact}"
scope="STATELESS"/>
</components>
<components>
<factory name="contact" value="#{contactManager.contact}"
scope="STATELESS"/>
</components>
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
auto-create="true" は <factory> 宣言とよく併用されます。
<components>
<factory name="session" value="#{entityManager.delegate}"
scope="STATELESS" auto-create="true"/>
</components>
<components>
<factory name="session" value="#{entityManager.delegate}"
scope="STATELESS" auto-create="true"/>
</components>
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
デプロイメントとテストの両方において同じ components.xml ファイルが使用されることがあります (若干の変更あり)。 Seam は components.xml 内に @wildcard@ 形式のワイルドカードを配置することが可能で、 Ant ビルドスクリプトまたはクラスパスに components.properties というファイルを与えることによって置き換えることができます (2 番目のアプローチを Seam のサンプルで見ることができます)。