36584


`@Stateless`と`@RequestScoped`は、どのように用途が異なりますか。

本家サイトで情報を見つけましたが、英語が苦手なので理解できませんでした。  
<https://stackoverflow.com/questions/28877658/what-is-the-difference-between-
stateless-session-beans-and-request-scoped-beans>  
<https://stackoverflow.com/questions/20558125/stateless-vs-requestscoped>


CC BY-SA 3.0
2016-09-29T13:37:37.480
29246
2017-07-22T10:48:02.693
2017-05-23T12:38:56.083
-1
8078
question
java java-ee
@Statelessと@RequestScopedの用途の違い


＃気になったので初心者ですが読んでみました。

説明上の想定例：  
コンテナが外部のremoteから呼び出され、(A). EJB(Stateless) or (B).
BackingBean(RequestScoped)を呼び出すとする。

(A)Statelessの場合  
要求がコンテナに来て、EJBで処理して返した後は、EJBを破棄してもいい。

(B)RequestScopedの場合  
要求がコンテナに来て、同様に返した場合、タイムアウトするか同じ人の次の別リクエストするまで保持する。つまりRequest完了時点を考えるとこちらのほうが生存期間が長い(httpのリクエストのような概念ではなく、コンテナの次のリクエストまでの間なので)。

ということではないでしょうか。

※jsfがformボタンなどで遷移の処理するとき、事後処理の後文字列で遷移先を指定させているのは、そのリクエスト後処理していることや、
トランザクションで失敗しているのもそのあたりの不自然さと実装上の影響が起因しているのかも。


CC BY-SA 3.0
2017-05-26T04:50:15.690
35030
2017-05-26T04:50:15.690
23381
29246
answer


`@Stateless` の場合、それが EJB であることを表し、同時に以下の性質を持ちます。

  * `@EJB` または `@Inject` による DI が可能になる。
  * EJB のインターセプターが有効になる。
  * デフォルトでトランザクション管理が有効になる (メソッドを抜けると自動的に COMMIT or ROLLBACK)。
  * EJB コンテナー内のプールにインスタンスが作成され、再利用される。 ※最近はあまりメリットはないですが…
  * オプションでリモート呼び出し、非同期呼び出し、タイマー呼び出しが可能になる。

`@RequestScoped` の場合、それが CDI Bean であることを表し、同時に以下の性質を持ちます。

  * `@Inject` による DI が可能になる。
  * CDI のインターセプター等、AOP 機能が有効になる。
  * `@Transactional` を併用すればトランザクション管理を有効にできる。

オブジェクトの生存期間は、管理しているコンテナーが違うため若干の差異はありますが、実用レベルでは概ね同じと考えて差し支えないでしょう。

CDI の方が軽量であり、また今後 EJB に代わる Java EE の中核技術と位置づけられていますので、CDI だけで実現できる場合は CDI
(`@RequestScoped`) を使い、EJB でしか提供されない機能を使用する場合には EJB (`@Stateless`)
を使う、というのが一つの目安となるでしょう。

※`@RequestScoped` アノテーションには CDI で定義される `javax.inject.RequestScoped` と JSF
で定義される `javax.faces.bean.RequestScoped` の 2 種類あります (今回話題になったものは CDI
で定義されるものです)。このうち JSF で定義される方は今後廃止予定のため (CDI 側への統合が完了したため) 使用しないようにしてください。


CC BY-SA 3.0
2017-07-22T10:48:02.693
36584
2017-07-22T10:48:02.693
24083
29246
answer