第26章 Spring Framework 統合
Spring Framework は Seam inversion-of-control (IoC) モジュールの一部です。 これにより Spring ベースのプロジェクトを Seam に移行しやすくなり、 Spring アプリケーションで Seam の主要な機能となる対話や高度な永続コンテキスト管理を利用できます。
注記
Spring 統合コードは
jboss-seam-ioc ライブラリに含まれています。 これは本章に記載されているすべての Seam と Spring の統合技術に必要となる依存ライブラリです。
Spring に対し Seam は次のような機能を提供します。
- Seam コンポーネントを Spring Bean にインジェクトする
- Spring Bean を Seam コンポーネントにインジェクトする
- Spring Bean を Seam コンポーネントに変換する
- Spring Bean を Seam コンテキストに配置できるようにする
- Seam コンポーネントで Spring WebApplicationContext を起動できるようにする
- Seam ベースのアプリケーションで Spring PlatformTransactionManagement の使用をサポートする
- Spring の
OpenEntityManagerInViewFilterおよびOpenSessionInViewFilterの代替として Seam 管理の使用をサポートする - Spring
TaskExecutorsで@Asynchronous呼び出しの支援をサポートする
26.1. Seam コンポーネントを Spring Bean にインジェクトする リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Seam コンポーネントのインスタンスを Spring Bean に
<seam:instance/> 名前空間ハンドラを使用してインジェクトします。 Seam 名前空間ハンドラを有効にするには、 Seam 名前空間をまず Spring Bean の定義ファイルに追加しなければなりません。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:seam="http://jboss.com/products/seam/spring-seam"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://jboss.com/products/seam/spring-seam
http://jboss.com/products/seam/spring-seam-2.2.xsd">
これで以下のように、いずれの Seam コンポーネントもあらゆる Spring Bean にインジェクト可能となりました。
<bean id="someSpringBean" class="SomeSpringBeanClass" scope="prototype">
<property name="someProperty">
<seam:instance name="someComponent"/>
</property>
</bean>
コンポーネント名の代わりに EL 式を使用することができます。
<bean id="someSpringBean" class="SomeSpringBeanClass" scope="prototype">
<property name="someProperty">
<seam:instance name="#{someExpression}"/>
</property>
</bean>
以下のようにして Spring Bean ID を使って Seam コンポーネントインスタンスを Spring Bean にインジェクトできます。
<seam:instance name="someComponent" id="someSeamComponentInstance"/>
<bean id="someSpringBean" class="SomeSpringBeanClass" scope="prototype">
<property name="someProperty" ref="someSeamComponentInstance">
</bean>
ただし、 Spring は Seam と異なり複数のコンテキストではステートフルコンポーネントモデルに対応するようには設計されていませんでした。 Spring インジェクションはメソッド呼出し時には発生しませんが、 Spring Bean がインスタンス化された時に発生します。
Bean がインスタンス化されるときに使用可能なインスタンスは Bean の寿命全体に渡り使用されます。 Seam の対話スコープのコンポーネントインスタンスを直接シングルトンの Spring Bean にインジェクトするとします。 このシングルトンは対話が終了した後もしばらくの間同じインスタンスへの参照を保持します。これは スコープインピーダンス と呼ばれます。
呼び出しがシステムを流れるように Seam バイジェクションは自然にスコープインピーダンスを維持します。 Spring では Seam コンポーネントのプロキシをインジェクトし、そのプロキシが呼び出された場合に参照を解決しなければなりません。
<seam:instance/> タグで自動的に Seam コンポーネントをプロキシできます。
<seam:instance id="seamManagedEM"
name="someManagedEMComponent"
proxy="true"/>
<bean id="someSpringBean" class="SomeSpringBeanClass">
<property name="entityManager" ref="seamManagedEM">
</bean>
上記の例では Spring Bean から Seam 管理永続コンテキストを使用する方法の例を示しています。 Spring
OpenEntityManagerInView フィルタの代替として Seam 管理永続コンテキストを使用するためのより堅牢な方法については、「Spring での Seam 管理永続コンテキストの使用」 の項を参照してください。