Destek fasulyeleri (@ManagedBean) veya CDI Beans (@Named)?


109

Core JavaServer Faces, 3rd Ed üzerinden okumaya yeni başladım . ve şunu söylüyorlar (vurgu benim):

JSF sayfalarında kullanılabilen çekirdekler için iki ayrı mekanizmanın, CDI çekirdeklerinin ve JSF yönetilen çekirdeklerinin olması tarihsel bir tesadüftür. Uygulamanızın Tomcat gibi düz bir servlet çalıştırıcı üzerinde çalışması gerekmediği sürece CDI fasulyeleri kullanmanızı öneririz .

Neden? Onlar vermeyin herhangi bir gerekçe. @ManagedBeanGlassFish 3 üzerinde çalışan bir prototip uygulamasındaki tüm çekirdekler için kullanıyorum ve bununla ilgili herhangi bir sorun fark etmedim. Bir yerden başka bir @ManagedBeanyere taşınmayı pek umursamıyorum @Namedama neden uğraşmam gerektiğini bilmek istiyorum .



4
@Bozho: Bu soru oldukça benzer, ancak Pascal'ın cevabını birkaç kez okuduktan sonra, CDI'nın neden çok daha üstün olduğunu hala anlamıyorum . CDI bilmiyorum ve "daha iyi" olduğu için öğrenmekten mutluyum. Neden daha iyi?
Matt Ball

"uygulamanızın Tomcat gibi düz bir sunucu uygulaması çalıştırıcı üzerinde çalışması gerekmediği sürece" Yalnızca tomcat kullanıyorum ve CDI'ı şiddetle tavsiye ediyorum. Tomcat, gayet iyi destekleyebilir
Karl Kildén

1
@ KarlKildén "düz sunucu çalıştırıcı", CDI özellikli olmayan bir sunucu uygulaması kabını ifade eder. Tomcat'i yazarken, CDI'ı biraz sihir dışında desteklemiyordu.
Thorbjørn Ravn Andersen

Yanıtlar:


64

CDI, düz JSF'ye göre tercih edilir çünkü CDI, JavaEE çapında bağımlılık enjeksiyonuna izin verir. Ayrıca POJO'ları enjekte edebilir ve yönetilmesine izin verebilirsiniz. JSF ile, CDI ile yapabileceklerinizin yalnızca bir alt kümesini enjekte edebilirsiniz.


- Yani temelde, neredeyse her sınıfının bir örneğini enjekte edebilir (bu "doğru şeyler" vardır sağlanan bu sadece bir no-arg yapıcı, nedir? I kullanmak varken, CDI ile) @ManagedBeanBen düz ile enjekte etmek istiyorum JSF?
Matt Ball

3
@MattBall Matt, seneler sonra bu göç hakkında yorum yapabilir misin?
Koray Tugay

5
@KorayTugay Bu koda Haziran 2011'den beri dokunmadım ama CDI'ye geçtim ve işler yolunda gitti. Varsa, belirli soruları hatırladığım kadarıyla yanıtlamaktan mutluluk duyarım.
Matt Ball

170

CDI kullanın.

JSF 2.3 uyarınca, @ManagedBeanbir kaldırıldı . Ayrıca 1417 numaralı spesifikasyona bakın . Artık seçmek için bir neden yok olduğunu bu araçlar @ManagedBeanüzerinde @Named. Bu ilk olarak Mojarra 2.3.0 beta sürümü m06'da uygulandı.

görüntü açıklamasını buraya girin


Tarih

Temel fark, @ManagedBeanJSF çerçevesi tarafından yönetilir ve yalnızca @ManagedPropertybaşka bir JSF tarafından yönetilen çekirdekler aracılığıyla kullanılabilir. @NamedCDI çerçeve ile uygulama sunucusu (konteyner) tarafından idare edilmekte ve yoluyladır olduğu @Injectgibi bir kap yönetilen dışlayıcı her türlü uygun @WebListener, @WebFilter, @WebServlet, @Path, @Stateless, vb ve hatta JSF @ManagedBean. Diğer taraftan, @ManagedPropertyyok değil bir içinde çalışma @Namedya da başka bir kap yönetilen eser. Gerçekten sadece içeride çalışıyor @ManagedBean.

Diğer bir fark da, CDI'nın istek başına / iş parçacığı temelinde hedef kapsamdaki geçerli örneğe delege eden proxy'leri gerçekten enjekte etmesidir (EJB'lerin nasıl enjekte edildiği gibi). Bu mekanizma, JSF ile mümkün olmayan, daha geniş kapsamdaki bir fasulyeye daha dar kapsamdaki bir fasulyenin enjekte edilmesine izin verir @ManagedProperty. JSF, burada fiziksel örneği doğrudan bir ayarlayıcıyı çağırarak "enjekte eder" (bu da tam olarak bir ayarlayıcıya ihtiyaç duyulduğu halde bununla birlikte gerekli değildir@Inject ).

Doğrudan bir dezavantaj olmasa da - başka yollar da vardır - kapsamı @ManagedBeansınırlıdır. Diğer bir bakış açısıyla, "çok fazla" ifşa etmek istemiyorsanız @Inject, yönettiğiniz fasulyeleri de saklayabilirsiniz @ManagedBean. protectedKarşı gibi public. Ama bu gerçekten sayılmaz.

En azından JSF 2.0 / 2.1'de, JSF destek çekirdeklerini CDI tarafından yönetmenin en büyük dezavantajı, CDI eşdeğeri olmamasıdır @ViewScoped. @ConversationScopedYakın gelir, ama yine de el başlatma ve durdurma gerektirir ve çirkin ekler cidsonuç URL'lerin istek parametresini. MyFaces CODI, JSF'leri CDI'ya tamamen şeffaf bir şekilde köprüleyerek işi kolaylaştırır, javax.faces.bean.ViewScopedböylece bunu yapabilirsiniz @Named @ViewScoped, ancak bu windowId, sonuç URL'lerine, ayrıca düz vanilya sayfadan sayfaya gezinmeye çirkin bir istek parametresi ekler . OmniFaces , tüm bunları @ViewScoped, fasulyenin kapsamını rastgele bir istek parametresi yerine JSF görünüm durumuna gerçekten bağlayan gerçek bir CDI ile çözer .

JSF 2.2 (bu soru / cevaptan 3 yıl sonra piyasaya sürülür) @ViewScoped, kutusundan yeni bir tam CDI uyumlu açıklama sunar javax.faces.view.ViewScoped. JSF 2.2 , eşdeğeri @FlowScopedolmayan yalnızca bir CDI ile birlikte gelir ve böylece @ManagedBeanJSF kullanıcılarını CDI'ya doğru iter. Beklenti şudur @ManagedBeanve arkadaşlar Java EE 8 uyarınca kullanımdan kaldırılacaktır. Halen kullanıyorsanız @ManagedBean, gelecekteki yükseltme yollarına hazırlıklı olmak için CDI'ya geçmeniz şiddetle tavsiye edilir. CDI, WildFly, TomEE ve GlassFish gibi Java EE Web Profili ile uyumlu kaplarda kolayca bulunur. Tomcat için, aynen JSF için yaptığınız gibi, ayrı olarak yüklemeniz gerekir. Ayrıca Tomcat'e CDI nasıl kurulur?


4
Oluşturduğum beans.xml, dönüştürülen @ManagedBeaniçin destek fasulye @Namedve dönüştürülmüş @ManagedPropertyiçin @Inject. Dünya ile her şey yolunda. Bununla birlikte, @EJBek açıklamalarımı olarak değiştirirsem @Inject, dağıtım ( org.jboss.weld.exceptions.DeploymentException) mesajıyla başarısız olur WELD-001408 Injection point has unsatisfied dependencies. @InjectArabirimsiz EJB'leri bir @Namedfasulyeye enjekte etmek için gerçekten kullanmalı mıyım yoksa buna bağlı kalmalı mıyım @EJB? EJB'ler, CDI çekirdeklerimi içeren WAR ile aynı KULAK içinde bir EJB KAVANOZU içinde paketlenmiştir.
Matt Ball

Sadece çalışmalı. Halen mevcut Weld sürümünde bu sorunla mı karşılaşıyorsunuz?
BalusC

Ne yazık ki söyleyemedim. Bu soru 2 işverenden ve> 2 yıl öncesinden. Bozho'nun cevabıyla ilgili eski yorumuma dayanarak, CDI /'ya geçmiş olmalıyım @Named.
Matt Ball

"MyFaces CODI, JSF'nin javax.faces.bean.ViewScoped'i CDI ile tamamen şeffaf bir şekilde köprüleyerek işi kolaylaştırır, böylece bunu yapabilirsiniz @Named @ViewScoped, ancak bu, sonuç URL'lerine, ayrıca düz vanilya sayfadan sayfaya gezinmeye çirkin bir windowId istek parametresi ekler." DeltaSpike ile bunun artık geçerli olmadığını unutmayın. Pencere Kapsamına ihtiyacınız yoksa, hem dsId hem de windowId URL parametrelerini devre dışı bırakabilirsiniz.
Ocak 2013

1
@Jan: Ve bu arada, OmniFaces ayrıca @ViewScopedJSF 2.0 / 2.1 için JSF 2.2'ye benzer : showcase.omnifaces.org/cdi/ViewScoped
BalusC

16

Java EE 6 ve CDI ile, Yönetilen Fasulye için farklı seçeneklere sahipsiniz

  • @javax.faces.bean.ManagedBeanJSR 314'e atıfta bulunmaktadır ve JSF 2.0 ile tanıtılmıştır. Ana amaç, fasulyeyi bir JSF Sayfası içinde kullanmak için faces-config.xml dosyasındaki yapılandırmayı önlemekti.
  • @javax.annotation.ManagedBean(“myBean”) JSR 316 tarafından tanımlanmıştır. JSF tarafından yönetilen çekirdekleri Java EE'de başka yerlerde kullanılmak üzere genelleştirir.
  • @javax.inject.Named(“myBean”) CDI'yı etkinleştirmek için web / WEB-INF Klasöründe bir fasulye.xml dosyasına ihtiyacınız olması dışında yukarıdakilerle hemen hemen aynıdır.

1
İlk ikisi arasındaki fark nedir?
Matt Ball

İlk ek açıklamanın amacı, JSF'de kullanım için faces-config.xml'deki bean yapılandırmasını değiştirmekti / idi. İkincisi, konsepti "java ee 6 konteynerine" kopyalar. Daha fazla işlevi vardır (@PostConstruct ve @PreDestroy ek açıklamaları gibi), ancak JSF Sayfası (İfade Dili ile) tarafından da erişilebilir.
h2mch

1
neden bir beans.xmldosyaya ihtiyacın var ? Bu bugün hala doğru mu?
Thufir

2
Hayır, JavaEE7 ile artık fasulye.xml'ye ihtiyacınız yok. bkz. docs.oracle.com/javaee/7/tutorial/doc/cdi-adv001.htm
h2mch

1
JavaEE7 ilebean.xml'e ihtiyacınız yok: docs.oracle.com/javaee/7/tutorial/cdi-adv001.htm (doğru bağlantı) blogs.oracle.com/theaquarium/entry/… (Java'da Varsayılan CDI Etkinleştirme EE 7)
M.Atıf Riaz

2

GlassFish 3.0.1'de CDI kullanıyordum, ancak çalışması için Seam 3 çerçevesini (Weld) içe aktarmak zorunda kaldım. Bu oldukça iyi çalıştı.

GlassFish 3.1'de CDI çalışmayı durdurdu ve Seam Weld onunla çalışmayı bıraktı. Bununla ilgili bir hata açtım ancak henüz düzeltilmediğini görmedim. Tüm kodumu javax.faces. * Ek açıklamalarını kullanmaya dönüştürmem gerekiyordu ancak çalışmaya başladıktan sonra CDI'ya geri dönmeyi planlıyorum.

CDI kullanmanız gerektiğini kabul ediyorum, ancak henüz çözülmediğini görmediğim bir sorun @ViewScoped notuyla ne yapacağım. Buna bağlı birçok kodum var. @ManagedBean ile birlikte kullanmıyorsanız @ViewScoped çalışıp çalışmadığı açık değildir. Biri bunu açıklığa kavuşturabilirse çok sevinirim.


-1

CDI'ya geçmek için iyi bir neden: @Injecthem JSF tarafından yönetilen fasulye hem de REST hizmetlerine (örneğin, Jersey / JAX-RS) dahil edilmiş ortak bir oturum kapsamlı kaynağa (örneğin, kullanıcı profili ) sahip olabilirsiniz.

Öte yandan, özellikle önemli AJAX içeren her şey için @ViewScopedJSF'ye bağlı kalmak için zorlayıcı bir nedendir @ManagedBean. CDI'da bunun için standart bir ikame yoktur.

Görünüşe göre @ViewScopedCDI fasulyeleri için benzer bir ek açıklama desteği olabilir , ancak kişisel olarak onunla oynamadım.

http://seamframework.org/Seam3/FacesModule

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.