CDIを使用します。
JSF 2.3に従い、@ManagedBean
は非推奨です。仕様の問題1417も参照してください。もう選択する理由がないことを、この手段@ManagedBean
を超えます@Named
。これはMojarra 2.3.0ベータバージョンm06で最初に実装されました。
歴史
中心的な違いは、@ManagedBean
JSFフレームワークによって管理され@ManagedProperty
、別のJSF管理Beanでのみ使用できることです。@Named
CDI・フレームワークを介してアプリケーションサーバ(コンテナ)で管理を介してである@Inject
ようなコンテナ管理アーチファクトの任意の種類の利用可能な@WebListener
、@WebFilter
、@WebServlet
、@Path
、@Stateless
、などともJSF @ManagedBean
。反対側から見ると、またはその他のコンテナ管理のアーティファクト内で@ManagedProperty
は機能しません@Named
。内部でのみ機能します@ManagedBean
。
もう1つの違いは、CDIは実際に、ターゲットスコープの現在のインスタンスに委任するプロキシを、リクエスト/スレッドごとに(EJBの注入方法などのように)注入することです。このメカニズムにより、より狭いスコープのBeanをより広いスコープのBeanに挿入できますが、これはJSFでは不可能@ManagedProperty
です。JSFは、ここで、setterを呼び出すことによって物理インスタンスを直接「注入」します(それが、setterが必要であるのとまったく同じ理由ですが、では必要ありません@Inject
)。
直接の欠点ではありませんが、他の方法があります—の範囲@ManagedBean
は単に制限されています。別の見方をすると、について「あまりにも」公開したくない場合は@Inject
、マネージドBeanだけを保持することもできます@ManagedBean
。protected
対のようなものpublic
です。しかし、それは実際には重要ではありません。
少なくとも、JSF 2.0 / 2.1では、JSFバッキングBeanをCDIで管理することの主な欠点は、に相当するCDIがないことです@ViewScoped
。@ConversationScoped
近づくが、それでも手動起動と停止要求し、それが醜い追加しcid
、結果のURLへのリクエストパラメータを。MyFaces CODIは、JSFを完全に透過的javax.faces.bean.ViewScoped
にCDIにブリッジして簡単にできるようにします@Named @ViewScoped
。ただし、windowId
単純なページ間のナビゲーションでも、結果のURLに醜い要求パラメーターを追加します。OmniFaces@ViewScoped
は、Beanのスコープを任意のリクエストパラメータではなくJSFビューステートに実際に結び付ける真のCDI でこれをすべて解決します。
JSF 2.2(この質問/回答から3年後にリリースされます)は、の@ViewScoped
フレーバーで、完全なCDI互換の新しいアノテーションを提供しますjavax.faces.view.ViewScoped
。JSF 2.2に@FlowScoped
は、@ManagedBean
同等のものがないCDIのみが付属しているため、JSFユーザーはCDIに向かっています。@ManagedBean
Java EE 8に従って、友人は非推奨になると予想されます。現在をまだ使用している場合は@ManagedBean
、将来のアップグレードパスに備えてCDIに切り替えることを強くお勧めします。CDIは、WildFly、TomEE、GlassFishなどのJava EE Webプロファイル互換コンテナーですぐに利用できます。Tomcatの場合は、JSFの場合とまったく同じように、個別にインストールする必要があります。TomcatにCDIをインストールする方法も参照してください。