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