@Component ile bir sınıfa açıklama eklerken, bu onun Spring Bean ve Singleton olduğu anlamına mı gelir?


111

Baharda oldukça yeni olduğum için bir sınıfa not eklemeyle ilgili bir sorum var. Bir sınıfa not eklerken @Componentbu, bu sınıfın bir Spring Bean ve varsayılan olarak bir singleton olacağı anlamına mı gelir?

Yanıtlar:


130

Evet, bu doğru, @Componentbir Bahar fasulyesi ve bir Singleton.

Sınıf, hizmet katmanına aitse, @Servicebunun yerine ek açıklama eklemek isteyebilirsiniz.

Ancak bu ek açıklamaların algılanması için şu satırı yerleştirmeniz gerektiğini unutmayın applicationContext.xml:

<context:component-scan base-package="com.yourcompany" />

Singletons hakkında - bahar fasulyelerinin tümü varsayılan olarak tekli kapsamdadır. Aklınızda bulundurmanız gereken tek şey, durumu alan değişkenlerinde saklamamanız gerektiğidir (sadece bağımlılıkları tutmalıdırlar). Böylece uygulamanız iş parçacığı açısından güvenli olacak ve her seferinde yeni bir fasulye örneğine ihtiyaç duymayacaksınız. Başka bir deyişle, fasulyeleriniz vatansızdır.


1
@Component ve veya @Service notlarını vb. Kullanırken, Singleton'lar oluşturduğum anlamına gelir, eşzamanlılık sorunlarıyla karşılaşmayacak mıyım? Benim yeni başlayan fikrim için, bu, ApplicationContext boyunca kullanılan bir fasulye ile sonuçlanacak, böylece eşzamanlı kullanıcılar tek çekirdeğe bir referans alacaklar. Yoksa bir şey mi kaçırıyorum?
Marco

3
@Marco herhangi bir durumunuz yoksa (bahar çekirdeklerinden farklı örnek değişkenleri), eşzamanlılık sorunu oluşmaz.
Bozho

Her seferinde yeni bir fasülye örneğini "istiyor" mu yoksa her seferinde yeni bir fasülye örneğini "istemez misin"?
Harshana

@Bozho Ne demek istiyorsun: "ve her seferinde yeni bir fasulye örneğine ihtiyaç duymayacaksın"? Spring'in yeni bir örnek oluşturmak zorunda kalmayacağı veya geliştirici olarak sizin yeni bir örnek oluşturmanız gerekmeyeceği anlamına mı geliyor?
user1766169

25

Varsayılan olarak - Evet.

Ancak, @Scopeaçıklamayı kullanarak bu davranışı geçersiz kılabilirsiniz . Örneğin:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

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.