JavaBeansを使うときにどのスコープに設定すべきか迷うことがありませんか?Requestスコープか、Sessionスコープか。とにかく何でもSessionにしてしまう人も多いのではないでしょうか。ここではスコープの使い分けについて解説します。
ManagedBeanとCDIの違い
その前にJabaBeansにはManagedBeanとCDIビーンズについて整理しておきます。それらによってスコープも違うからです。
それぞれの定義
- ManagedBeanとは: JSFで規定されたもので一般のJavaBeansをJSFが管理するもの。アノーテーション@ManagedBeanで識別します。@ManagedBeanとそのスコープはjavax.faces.beanパッケージに定義されています。
- CDI(Contexts and Dependency Injection)とは: Java EE6から追加された仕様で通常のJavaBeansをDI、つまり依存性注入で管理するというものJava EEの中ではEJB(Enterprise JavaBeans)に追加されたBeansです。アノーテーション@Nanedで識別します。@Nanedやそのスコープはjavax.injectとjavax.enterprise.contextに定義されています。
JavaEE7からはCDIがデフォルトになっており、そのためNetBeansIDE8.xでは「ManagedBeanは次のJSFバージョンで無くなる予定だ」というメッセージが出ます。しかし今はJSF2.2ではどちらも問題なく使えます。全体的な流れはCDIにあるようで、今後はそれを使った方が良いというのが大多数です。注意すべきは、それらに定義の仕方やスコープに少し違いがあることです。
@ManagedBean(name=”custom”)
@RequestScoped
public class MyBean {……
}
@Named(value=”custom”)
@RequestScoped
public class MyBean {……
}
それぞれのスコープ
CDIのほうが種類が多くなっています。共通するものも多いです。
ManagedBean | CDI | 意味 |
---|---|---|
RequestScoped | RequestScoped | HTTPリクエストとレスポンスの中で有効 |
ViewScoped | ViewScoped(javax.faces.view) | ブラウザーのウィンドウ/タブの同一JSFビューの中で有効 |
SessionScoped | SessionScoped | 複数回のHTTPリクエストとレスポンスの中で有効。 |
ApplicationScoped | ApplicationScoped | Webアプリケーションが生きている間は有効 |
ConversationScoped | 開発者がスコープを独自に設定できるもの。SessionScopeを自由に延長するようなもの。 | |
FlowScoped(javax.faces.flow) | 開発者が複数のページにわたりビーンの有効範囲を設定できる。 | |
Dependent | CDIではデフォルトのスコープ | |
CustomScoped | 開発者がスコープを独自に設定できるもの | |
NoneScoped | 他のBeansにサービスするための補助的な用途に使用される |
次回から詳しく解説します。


JSF2.2のすべてをまとめたkindle電子書籍 「JavaServer Faces2.2 入門」もぜひご覧ください。パソコン、iPhone、Androidどんな端末用にもamazonが無料のKindle電子書籍リーダーを用意しています。それをつかってKindle本を手軽にお楽しみください。あなたが今お使いの端末用Kidle電子書籍リーダーのご案内