CDI'da @ApplicationScoped ve @Singleton kapsamları arasındaki fark nedir?


96

CDI'da @ApplicationScopedve ( javax.inject) @Singletonsözde kapsamı vardır. Onların arasındaki fark ne? @ApplicationScopedVekil olan ve @Singletonolmayan gerçeğin yanı sıra .

Sadece değiştirebilir miyim @Singletonhiç fasulye @ApplicationScoped? Can @ApplicationScopedfasulye iki (veya daha fazla) örneği bulunabilir?


12
Kaynak referansını okudunuz mu? 5.4 (s. 36) bölümünde @ApplicationScopedve arasındaki pratik farklılıklar hakkında bazı açıklamalar var @Singleton.
brandizzi

1
Hangi Singleton kapsamından bahsediyorsunuz - javax.ejb veya javax.inject?
John Ament

Yanıtlar:


30

@SingletonCDI spesifikasyonunun bir parçası değildir. EJB ve javax.inject(JSR-330) ' un bir parçasıdır . Şartnamede davranışının ne olduğundan bahsedilmemiştir, bu nedenle yalnızca Kaynak belgelerinde yazılanlara güvenebilirsiniz.


11
Bu doğru değil. Javax.inject.Singleton ek açıklaması vardır. CDI'nin bir parçasıdır. Burayı
amorfis

5
@amorphis - Önümde CDI spesifikasyonu var. Hatta bazı kısımlarını uyguladım ve hiçbir şeyden bahsetmiyor @Singleton. Açıklama yapılmadan sadece bir örnekte gösterilmiştir. CDI'ın dayandığı doğrudur javax.inject, ancak kesinlikle söylemek gerekirse CDI spesifikasyonunun bir parçası değildir. Bununla birlikte cevabımı biraz düzelttim dedi.
Bozho

17

Kısaca: Hatta karıştırabilirsiniz ( @Singletonve @ApplicationScoped) ve bazı senaryolarda mantıklıdır. (ve benimkinde beklendiği gibi çalışıyor!)

Şimdiye kadarki diğer cevaplara ek olarak, gerçek dünya senaryolarına açıklık getirmek için birkaç nokta daha eklemek istiyorum.

Benim için bu soru , uygulama kapsamlı bir bean'ı uygulama başlangıcında başlatmaya nasıl zorlayabilirim? Orada bazı tartışmalarda bunu söyledim ve şu ana kadar buna karşı geçerli bir argüman bulamadım:

Pek çok gerçek hayat senaryosunda / kurulumunda - soyut / modelleme açısından - bir şeyin bir EJB mi yoksa uygulama kapsamlı bir yönetilen fasulye mi olduğunu (ya da böyle olacağını / muamele göreceğini) kesin olarak söylemenin zor olduğunu söyleyebilirim.

Şimdiye kadar buna karşı (tartışmalı ama kesin olmayan) argümanlar (benim açımdan): (@BalusC ve diğerleri: Bunların kesin olduklarını görmek isterim, ancak değilse, yukarıdakiler doğru olabilir ve yine de argümanlar Yine de okuyucunun farklılıkları / avantajları / dezavantajları / kötü / iyi uygulamaları anlamasına yardımcı olur)

EJB ve Yönetilen Bean

BalusC : Bu, yönetilen bir fasulye değil, EJB, oldukça farklı. EJB'ler arka uçta çalışır ve ön uçta çekirdekler yönetilir. EJB'ler de işlem bağlamında çalışır. [...] İşletme fasulyelerini yönetilen fasulyelerle karıştırdınız ve ben sadece buna işaret ettim.

fakat:

ben : Sanırım tam olarak doğru değilsin ve anlamı / kullanımı abartıyorsun ve bu bana tartışmalı görünüyor. http://en.wikipedia.org/wiki/Enterprise_JavaBeans

Kurumsal JavaBeans (EJB), kurumsal yazılımın modüler yapısı için yönetilen bir sunucu yazılımı ve çeşitli Java API'lerinden biridir. EJB, bir uygulamanın iş mantığını kapsayan bir sunucu tarafı yazılım bileşenidir.

Kuru Fasulye Türleri

"Durum Bilgili", "Vatansız" veya "Tekli" olabilen Oturum Fasulye [3] [...]

Mesaj Tahrikli Fasulye [...]

... benim durumumda hala geçerli olan.

Singleton EJB ile Uygulama Kapsamlı Fasulye

Kilitleme

BalusC : Bir singleton EJB, uygulama kapsamlı bir fasulye ile aynı değildir. Bir singleton EJB okuma / yazma kilitlidir ve bu nedenle aklınızdaki görev için potansiyel olarak verimsiz / aşırı uyumludur. Uzun lafın kısası: İyi bir Java EE kitabı alın ve iş için doğru aracı kullanmayı öğrenin. Bir yol kesinlikle diğer yol değil. Çalışması, doğru araç olduğu anlamına gelmez. Bir balyoz bir vidayı sıkabilir, ancak bunun için mutlaka doğru alet değildir :)

fakat:

(Balyozu burada göremiyorum - üzgünüm ...) Kilitleme varsayılanlarını bilmek güzel (bunun farkında değildim), ancak bu yine yanlış görünüyor: Oracle Java EE 6 Tutorial on Managing Concurrent Access in a Singleton Session Bean

Bir singleton oturum çekirdeği oluştururken, singleton'un iş yöntemlerine eşzamanlı erişim iki şekilde kontrol edilebilir: konteyner tarafından yönetilen eşzamanlılık ve fasulye tarafından yönetilen eşzamanlılık. [...]

Varsayılan olarak, singletonlar konteyner tarafından yönetilen eşzamanlılığı kullansalar da, @ConcurrencyManagement (CONTAINER) ek açıklaması, eşzamanlılık yönetim türünü açıkça ayarlamak için singleton sınıf düzeyinde eklenebilir


Kaynak karıştırma ile eğlenmez: Uygulamayı yüklerken istisna: CDI tanım hatası: WELD-000046: [EnhancedAnnotatedTypeImpl] genel ApplicationScoped Singleton MyClass üzerinde en fazla bir kapsam belirtilebilir. Javax.inject.Singleton kullanma.
sgflt

12

Genellikle, bir nesnenin yalnızca bir örneğine sahip olmak istediğinizde, muhtemelen @ApplicationScopedaçıklama kullanmalısınız - bu tür nesnelerin proxy'si yapılır ve bu nedenle, kullanıma hazır olarak düzgün bir şekilde serileştirilebilir.

Öte yandan, sınıfın yalnızca bir örneğini istediğiniz, ancak bu tür bir sınıfın vekaleten (örneğin son olduğu için) - o @Singletonzaman bir kurtarma olduğu birçok durum vardır. Çünkü Singletonsözde kapsamdır ve herhangi bir "normal" kapsam gibi vekaleten kullanılmamaktadır.


Çok belirsiz olduğu için buna olumsuz oy veriyorum. Beş yıldır Java EE'de kod yazıyorum, dersler alıyorum ve kitap okuyorum, ancak "böyle bir nesnenin proxy'si var", "düzgün bir şekilde serileştirilebilir" ve "sözde- dürbün". Ne demek istediğini biliyormuşsun gibi göründüğü için bunun ne anlama geldiğini bilmek isterim, ama yazıldığı gibi cevabının Java EE geliştiricilerin çoğuna yardımcı olacağını hayal edemiyorum.
Davids

2
Bununla birlikte, EJB'lerin vekaleten olduğunu biliyorum. Benim kafa karışıklığım kısmen Singletons için yaptığınız ayrımla ilgili.
Davids

9

@SingletonJSR-299'da, Singleton adı verilen yerleşik bir kapsamdaki JSR-299 yönetilen fasulyeleri değil javax.ejb.Singleton, Singleton oturum fasulyelerini ( değil javax.inject.Singleton) belirtir .

@ApplicationScopedSpesifikasyonda net olmadığı için sunucunuzda EAR başına bir veya SAVAŞ / EJB-JAR başına bir tane bulabilirsiniz , ancak kesinlikle JVM başına bir olmasını beklememelisiniz.


7

Bir fark daha var: kapsam normal bir kapsam olmadığından @Singleton, ek açıklamaları tanımlayan fasulye Singletondeğildir. Daha sonra @ApplicationScopedek açıklamaları tanımlayan fasulye.

CDI 1.1 spesifikasyonuyla: Keşif modundaki uygulama = açıklamalı olduğunda, Weld, çekirdekleri tanımlamaz @Singletonve bu


2

Sınıfınızı varsayılan kurucuyla yazabileceğiniz en büyük farklardan biri, kullanırken özel erişim değiştiriciye sahiptir javax.inject.Singleton, ancak sınıfınız kullanırken en azından varsayılan erişim değiştiriciye sahip varsayılan kurucuya sahip olmalıdır javax.enterprise.context.ApplicationScopedve bu JBOSS 6.1 GA Finaluygulama


"Varsayılan kurucu" mu demek istediniz?
Treefish Zhang
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.