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) │
└────────────┴─────────────────────────────────────────────────────┘
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ş @Component
lerdir. Bunlarla belirli eylemleri gerçekleştirmeyi seçebilirsiniz. Örneğin:
@Controller
fasulyeleri kullanılırBir 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.
Veritabanı bağlantısı açısından @Service
ve @Repository
ek açıklamalarının kullanımı önemlidir.
@Service
kullanın@Repository
kullanınUygun 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.