2012-08-31 6 views
11

他の(@ NoneScoped)Beanへの参照を必要とするJSFバッキングBeanがあります。Inject対ManagedProperty

@Injectまたは@ManagedPropertyを使用して、コンテナからインスタンス参照を取得する必要がありますか?

なぜ私は1つではなく、他の人を使用して、私の心で2つのアプローチは同じことを達成します。

答えて

10

@ManagedPropertyおよび@NoneScopedは、JSF 2.0仕様のものであり、@InjectはCDI仕様のものです。

他のJavaEE 6機能を使用していないサーブレットアプリケーションで作業している場合は、@ManagedPropertyに移動してください。その注釈は@Injectに対しても利点があります:EL(式言語)をそれに使用することができます(although there are workarounds to get that in CDI)。

アノテーション/コンテナは両方とも、「同じもの」を達成するようですが、非常に異なる方法で、それぞれ異なる容器で動作します。 CDIによって管理されるBeanは、JSFでは使用できますが、viceversaでは使用できません。 BeanにJSF固有の注釈を付ける場合は、カスタム修飾子、インターセプタ、プロデューサメソッドなどを忘れてしまいます。最終的には、より洗練されていますが、実際のニーズに応じて選択するのが普通です。あなただけ(何も指定しない場合、すべての豆が@Defaultスコープ下にあるCDIで@NoneScoped注釈を、理解することはできませんCDI)@ManagedPropertyに、その後スティックをJSFの機能を使用していることそれはそうと

することは、それをラッピング。あなたのプロジェクトでCDIに切り替えることは、@ManagedProperty@Injectに置き換えるだけでなく、CDI固有のものをすべて@RequestScoped(など)に置き換えることを意味するかもしれません。

6

可能であれば、マネージドBeanに比べてCDIを好むでしょう。 CDIはデプロイ時の依存性チェックが豊富で、プロキシサポートによりスコープリークが防止されます。これにより、モデルの正しさを簡単に検証できます。 Producersは、一般に、必要に応じてグルーコードを提供するために使用できます。

+2

私は以下の何に似て、これを、追加し、あなたがCDIに注入できるEJBのようなものを持っています。あなたが@Nameを与えないと、それらをあなたの見解から守ることもできます(単にELで利用できるようになります)。 CDIを使用すると、JSFで使用できるものよりも拡張ポイントが大きくなりますが、これは質問の一部ではありません:) CDIを使用することをお勧めします。 – LightGuard