JBoss Seamのサンプルアプリを試す。その4
サンプルアプリケーションBookingの続きです。
HotelBookingActionのソースと注釈は1.3.3. Understanding Seam conversationsにあります。
以下は注釈の訳です。
-
- @Stateful アノテーションはこのクラスがステートフルなSessionBean Classだと宣言するEJBのアノテーションです。ステートフルSessionBeanのスコープはデフォルトではConversation Contextとなります。
- @Conversational アノテーションは@Beginでアノテーションされたメソッドから呼ばれたLong-RunningなConversation外で動作しないコンポーネントであると言う宣言です。もしLong-Running Conversation外から呼ばれた場合はSeamはJSFへifNotBegunOutcomeを返します。
- @LoggedIn アノテーションは作成したSeam Interceptor(LoggedInInterceptor)へ処理を依頼します。これは@LoggedInが@Interceptorと合わせて宣言されているためです。
- @PersistenceContext(type=EXTENDED) はEJB3の拡張されたPersistence Contextで全てのEntityBeanのインスタンスが管理されたステートフルSessionBeanのライフサイクル全てに含まれます
- @DataModel アノテーションはListをJSFのListDataModeとして表します。これは検索画面などでのクリッカブルリストを実装するのを容易にします。ここではhotelsと名付けたConversatio変数内でListDataModelとしてページを表します。
- @DataModelSelectionIndex アノテーションは@DataModelのプロパティに対応した行インデックスを保持するフィールド又はGet/Setのペアを定義します。
- @Out アノテーションはメソッドが呼ばれた後に属性値がContext変数へ他のクラスへの依存性の注入を行います。ここではhoetlと名付けられたContext変数へ各Action Listenerが呼び出され終えた後にhotelインスタンス変数の値がセットされます。
- @Begin アノテーションは Long-Running Conversationの開始を明示し、リクエストの終了まで作業中のConversation Contextが破棄されないようにします。それよりも作業中のウィンドウからのリクエストの全てを再び結びつけたり、Conversation非活性化までの時間が過ぎるか、@Endアノテーションされたメソッドが呼ばれて破棄したりします。
- @End アノテーションは作業中のLong-Running Conversationを終了させます。又作業中のConversation Contextをリスエストの終了時点で破棄します。
- @Removeは通常のEJBのアノテーションでアノテーションされたメソッドが呼ばれた後に状態を破棄すると供にステートフルSessionBeanを破棄します。Seamでは全てのステートフルSessionBeanはいずれかのメソッドに@Destroyか@Removeを記述すべきです。これはSeamがConversation Contextを破棄したときにEJBのRemoveメソッドを呼びます。実際には@Destroyアノテーションの方が一般的には使い勝手がよく、どんなSeamのContextが破棄されたときの後始末にも使えます。@Destoryや@Removeのアノテーションされたメソッドがないと状態はリークしパフォーマンスの問題に苦労します。
HotelBookingActionはホテル検索、選択、予約、予約確認の全てのAction Listenerメソッドが実装され、HotelBookingActionインスタンス変数にこの作業に関わる全ての状態が保持されています。HttpSession属性から値を受けたり、返したりするよりもシンプルできれいなコードだと思いませんか。
ひとりのユーザが複数のそれぞれがログインした独立したConversationを持つことさえ出来ます。試して下さい。ブラウザのタブで複数のホテル検索ページへログインして下さい。同時に別々のホテル予約を作成することができます。ひとつのConversationをある程度ほっておいて下さい、SeamはConversationをタイムアウトとし、状態を破棄します。
以上、http://docs.jboss.com/seam/reference/en/html/tutorial.htmlを見てきましたが、未だEJB3.0もJSFも理解が出来ていないせいかもう一つピンと来ません。
原因は
- bijection(双方向での依存性の注入)
- Conversationと言う作業単位
が具体的に見えてきていないせいもあります。しかし使いこなせば強力なフレームワークになりそうです。