JSF2'yi öğrendiğim gibi, destek bileşenlerinin ne olması gerektiğinden emin değilim. Tasarım açısından bakıldığında, EJB'ler arasındaki fark nedir?
@ManagedBeans?
Sonunda JPA kullanacağım, dolayısıyla EJB iş katmanları için doğal bir seçim. EJB'yi doğrudan JSF'den kullanmak iyi bir uygulamadır (açıklandığı gibi) İşte)?
Şu anda kullanmaya doğru yaşıyorum
@ManagedBeans iş katmanına erişmesi gerekmeyen bileşenler (ör., görüntü yardımcıları) veya istek / oturum verileriyle ilgilenen bileşenler için. Diğer amaçlar için, ör. Bir ızgarada bir şey listelemek, doğrudan EJB'ye erişirim.
Bu iyi bir tasarım mı? Kullanayım mı
@ManagedBeans Bazı durumlarda, sadece EJB'ye delege olsalar bile, temiz katman ayırma uğruna tüm destek fasulyeleri için?
Çok geçerli bir soru, ama cevabın cevabı projenize yönelik yaklaşımın "katılığına" bağlıdır. Her ikisi de bazı iş mantığı uygulamak gibi JSF destek fasulye ve EJB arasında gerçekten fazlalık var.
İçinde ideal JSF özelliklerinin kullanımı
converters,
rendered,
validatorvb. could Gerçekten temiz iş mantığı kodu. Ancak uygulamada, sunumla ilgili bazı mantık genellikle sızar.
Bu sunumla ilgili mantık ideal olarak EJB'de olmamalıdır. Bu sunumla ilgili mantık yüz paketine bağlı olabilir, ancak gerekli değildir. Bu ne yapar Bu sunum ile ilgili ya da değil.
Birleşik bir bileşen modelinin bazı avantajları olsa da. Ve bu yaklaşımın Dikiş ve bahar. Her iki durumda da, deklarasyonlu işlem içeren ticari bileşen, vb. Doğrudan JSF'de kullanılabilir (Spring, EJB'yi kullanmaz fakat benzer bir model sağlar). Ancak EJB püresi, ikisini ayırmanız gerektiğini söylüyor.
Bana göre sonuçta projenin tadı ve büyüklüğü meselesi. JSF'de EJB kullanan küçük / orta ölçekli bir proje için iyi çalıştığını hayal edebiliyorum. Bu sıkılığın kritik olduğu daha büyük proje için, katmanları vidalamadığınızdan emin olun.
Java EE 6'da çeşitli yönetilen çekirdekler arasında bir miktar örtüşme vardır: JSF yönetilen fasulye (@ ManagedBean), CDI tarafından yönetilen fasulye (@Named) ve EJB çekirdekleri (@Stateless, @Statefull, @Singleton).
Görünüm katmanında @ManagedBean ile yapıştırmak için herhangi bir avantaj görmüyorum. @Named'in CDI varyantı, aynı ve daha fazlasını yapabilir, örneğin; dönüşüm kapsamına erişim sağlar.
Mevcut düşünce, sonunda EJB bileşen modelinin bir CDI ek açıklamaları seti olarak yeniden donatılacağı gibi görünüyor. Özellikle uzman grup üyesi Reza Rahman buna sık sık işaret ediyor. Bakınız örn. Java EE 6'da Bağımlılık Enjeksiyonu - Bölüm 1
Şimdilik bu olmadı, bu nedenle EJB çekirdekleri, özellikle de JPA kalıcılık için kullanıldığında iş mantığını yerleştirmek için en kolay yer olmaya devam ediyor.
Yine de, CDI EJB, IMHO yetenekleri elde edip etmeyecek olsun ya da olmasın, "destekleyici" kavramı için ayrı bir fasulye ve "iş mantığı" için ayrı bir fasulye kullanmak için hala en iyi uygulamadır.
Destek çekirdeği, model nesneleri ve hizmetlere (EJB'ler) bazı referanslar içeren, gerçekten ince olabilir. Destek fasulyesinin Eylem Yöntemleri, neredeyse doğrudan hizmetlere delege verebilir, ancak bunların katma değeri kullanıcıya geri bildirim sağlayarak (Başarı veya başarısızlık üzerine FacesMessages ekleyerek) ve küçük UI modifikasyonları yapmaktır (örneğin, bazı iletişim pencerelerini görüntüleyen bir false ayarlayarak). .
Hizmetler (iş mantığı) herhangi bir sunum hakkında hiçbir şey bilmemelidir. JSF destekli fasulye, JAX-RS, Servlets, bağımsız Java SE uzak istemcileri veya her ne olursa olsun aynı şekilde kullanılabilirler.
Bütün fasülyeler CDI fasülyesi olsa bile, bu, bu temel sorumluluk bölümünü değiştirmez.
İlginç yazı, bunu bilmiyordu. Ancak, bana bu yazı JSF yönetilen fasulye doğru bir rant daha çok gibi kokuyor. Ayrıca EJB'yi JSF ile sıkı sıkıya birleştirir. Küçük (kişisel) uygulamalarda ilginç olabilir, ancak muhtemelen EJB'ler üzerinde tam kontrole sahip olmak istediğiniz gerçek dünyadaki SOA uygulamalarında bulunmaz.
Ne için kullanacağına gelince, ben sadece yapışırdım
@ManagedBean Bir JSF modelini belirtmek için - bir veya daha fazla özel JSF görünümüne bağlıdır. Mükemmel kullanabilirsiniz
@EJBJSF olmayan özel iş mantığı ve / veya veri modelleri için. Enjekte edebilirsin
@EJBbir JSF modelinde var ve bunu eylem yöntemlerinde ve belki de alıcılar / belirleyicilerde devrediyorsunuz, ancak diğer yolu yuvarlak yapmamalısınız, yani JSF modelini bir
@EJBBu sıkı bir bağlantıya yol açar ve
@EJBJSF içeriğinin dışında kullanılamaz. Şimdiye kadar, tasarımınız kulağa hiçbir şey aktarmayacağınız sürece iyi geliyor.
javax.faces paketinde
@EJB sınıf.
EJB'yi XHTML'nizden çağırarak, görünüm ve iş katmanındaki uygulama seçimi arasında sıkı bir bağlantı kuruyorsunuz.
EJB'yi çağırmak için yönetilen bir fasülye kullanırsanız [veya hatta bir iş temsilcisine koyun], katmanınızı (XHTML) etkilemeden iş katmanınızı tamamen Spring'e dönüştürebilirsiniz.
Teknik olarak mümkün ve sizin için çok kolay (JSR 299) EJB'yi yönetilen fasülye olarak kullanabiliyorsunuz ve muhtemelen bu satıcıların yapman gerekeni - spesifikasyonlara yapıştırabilirsiniz. Ama bu doğru bir şey mi? - Yok hayır.