Spring'de @Component, @Repository & @Service ek açıklamaları arasındaki fark nedir?

Spring'de @Component, @Repository ve @Service ek açıklamaları birbirinin yerine kullanılabilir mi veya bir gösterim aracı olarak hareket etmenin yanı sıra belirli bir işlevsellik sağlarlar mı?

Başka bir deyişle, bir Service sınıfım varsa ve ek açıklamayı @Service yerine @Component olarak değiştirirsem, yine aynı şekilde davranmaya devam eder mi?

Yoksa ek açıklama sınıfın davranışını ve işlevselliğini de etkiliyor mu?

Spring Documentation](https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans-stereotype-annotations) adresinden:

Spring 2.0 ve sonrasında, @Repository ek açıklaması aşağıdakiler için bir işaretleyicidir rolünü veya stereotipini yerine getiren herhangi bir sınıf (ayrıca Veri Bir deponun Erişim Nesnesi veya DAO). Bu işaretleyicinin kullanımları arasında istisnaların otomatik olarak çevrilmesidir.

Spring 2.5 daha fazla stereotip ek açıklamaları sunar: @Component, @Service, ve @Controller. @Component herhangi bir bileşen için genel bir stereotiptir. Spring tarafından yönetilen bileşen. @Repository, @Service ve @Controller şunlardır daha özel kullanım durumları için @Component özelleşmeleri, örneğin Örneğin, kalıcılık, hizmet ve sunum katmanlarında, sırasıyla.

Bu nedenle, bileşen sınıflarınıza @Component ile açıklama ekleyebilirsiniz, ancak bunlara @Repository, @Service veya @Controller ile açıklama ekleyerek bunun yerine, sınıflarınız araçlar tarafından işlenmek için daha uygundur veya yönlerle ilişkilendirme. Örneğin, bu stereotip ek açıklamaları nokta kesimleri için ideal hedefler oluşturur.

Böylece, eğer @Component veya @Service arasında seçim yapıyorsanız hizmet katmanınız, @Service açıkça daha iyi bir seçimdir. Benzer şekilde, Yukarıda belirtildiği gibi, @Repository zaten bir işaretleyici olarak desteklenmektedir. kalıcılık katmanınızda otomatik istisna çevirisi.

┌────────────┬─────────────────────────────────────────────────────┐
│ Annotation │ Meaning                                             │
├────────────┼─────────────────────────────────────────────────────┤
│ @Component │ generic stereotype for any Spring-managed component │
│ @Repository│ stereotype for persistence layer                    │
│ @Service   │ stereotype for service layer                        │
│ @Controller│ stereotype for presentation layer (spring-mvc)      │
└────────────┴─────────────────────────────────────────────────────┘
Yorumlar (12)

Bunlar neredeyse aynıdır - hepsi sınıfın bir Spring çekirdeği olduğu anlamına gelir. @Service, @Repository ve @Controller özelleşmiş @Componentlerdir. Bunlarla belirli eylemleri gerçekleştirmeyi seçebilirsiniz. Örneğin:

  • spring-mvc tarafından @Controller fasulyeleri kullanılır
  • @Repository` fasulyeleri kalıcılık istisnası çevirisi için uygundur

Bir başka şey de bileşenleri anlamsal olarak farklı katmanlara atamanızdır.

@Componentin sunduğu bir şey, diğer ek açıklamaları onunla birlikte ekleyebilmeniz ve ardından bunları@Service` ile aynı şekilde kullanabilmenizdir.

Örneğin geçenlerde yaptım:

@Component
@Scope("prototype")
public @interface ScheduledJob {..}

Yani @ScheduledJob ile açıklanan tüm sınıflar spring bean'dir ve buna ek olarak quartz jobs olarak kaydedilir. Sadece belirli ek açıklamayı işleyen kodu sağlamanız gerekir.

Yorumlar (3)

Veritabanı bağlantısı açısından @Service ve @Repository ek açıklamalarının kullanımı önemlidir.

  1. Tüm web hizmeti türü DB bağlantılarınız için @Service kullanın
  2. Tüm stored proc DB bağlantılarınız için @Repository kullanın

Uygun ek açıklamaları kullanmazsanız, geri alma işlemleri tarafından geçersiz kılınan commit istisnalarıyla karşılaşabilirsiniz. Stres yük testi sırasında JDBC işlemlerini geri alma ile ilgili istisnalar göreceksiniz.

Yorumlar (2)