@Statelessと@RequestScopedの用途の違い


`@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>




`@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 側への統合が完了したため) 使用しないようにしてください。




`@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 側への統合が完了したため) 使用しないようにしてください。

