Cevapların çoğu zaten bu ek açıklamaların ne için kullanıldığını belirttiğinden, burada aralarındaki bazı küçük farklılıklara odaklanacağız.
Önce Benzerlik
Tekrar vurgulamaya değer ilk nokta , BeanDefinition için tarama-otomatik algılama ve bağımlılık enjeksiyonu ile ilgili olarak tüm bu ek açıklamaların (viz., @Component, @Service, @Repository, @Controller) aynı olmasıdır. Birini diğerinin yerine kullanabiliriz ve yine de yolumuza devam edebiliriz.
@Component, @Repository, @Controller ve @Service arasındaki farklar
@Bileşen
Bu, sınıfın bir yay bileşeni olduğunu gösteren genel amaçlı bir stereotip ek açıklamadır.
@Component ne özelliği var
<context:component-scan>
sadece tarar@Component
ve aramaz@Controller
,@Service
ve@Repository
genel olarak. Taranırlar çünkü kendilerine açıklama eklenirler@Component
.
Sadece bir bakmaktır @Controller
, @Service
ve @Repository
açıklama tanımları:
@Component
public @interface Service {
….
}
@Component
public @interface Repository {
….
}
@Component
public @interface Controller {
…
}
Böylece, söylemek yanlış değil @Controller
, @Service
ve @Repository
özel türleri vardır @Component
açıklama. <context:component-scan>
Onları alır ve izledikleri gibi aşağıdaki sınıflarını fasulye olarak kaydeder @Component
.
Özel tür ek açıklamaları da taranır, çünkü kendileri ek açıklama ile @Component
ek açıklama eklenir, bu da aynı zamanda @Component
s oldukları anlamına gelir . Kendi özel ek açıklamamızı tanımlar ve ek açıklama @Component
eklersek,<context:component-scan>
@Repository
Bu, sınıfın bir veri havuzu tanımladığını gösterir.
@Repository hakkında özel olan nedir?
Bunun, Ek Açıklama tabanlı bir Yapılandırma olduğunu belirtmenin yanı sıra , @Repository
işi platforma özel istisnaları yakalamak ve bunları Spring'in birleştirilmiş kontrolsüz istisnasından biri olarak yeniden atmaktır. Bunun için, PersistenceExceptionTranslationPostProcessor
Bahar uygulamamızın uygulama bağlamına şöyle eklememiz gerekiyor:
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
Bu fasulye sonrası işlemcisi, açıklamalı herhangi bir çekirdeğe bir danışman ekler, @Repository
böylece platforma özgü istisnalar yakalanır ve daha sonra Spring'in kontrol edilmemiş veri erişimi istisnalarından biri olarak yeniden atılır.
@Controller
@Controller
Açıklama özel bir sınıf bir kontrol görevi görür göstermektedir. @Controller
Açıklama rolünü gösteren açıklamalı sınıf için bir klişe olarak hareket eder.
@Controller hakkında özel olan nedir?
Bu ek açıklamayı , aynı görünseler bile @Service
veya benzeri herhangi bir şeyle değiştiremeyiz @Repository
. Dağıtıcı, açıklamalı sınıfları tarar ve açıklamalı açıklamalı açıklamaları @Controller
tespit eder @RequestMapping
. Biz kullanabilirsiniz @RequestMapping
kimin sınıflar not eklenmiş sadece bu yöntemlerde / üzerinde @Controller
ve onu edecektir DEĞİL çalışmak @Component
, @Service
, @Repository
vs ...
Not: Bir sınıf zaten aracılığıyla gibi, herhangi bir alternatif yöntemle bir fasulye olarak kayıtlıysa @Bean
veya içinden @Component
, @Service
vb ... ek açıklamalar, daha sonra @RequestMapping
sınıfı da ek not ise alınabilir @RequestMapping
açıklama. Ama bu farklı bir senaryo.
@Hizmet
@Service
çekirdekleri iş mantığını ve çağrı yöntemlerini depo katmanında tutar.
@Service hakkında özel olan nedir?
İş mantığına sahip olduğunu belirtmek için kullanıldığı gerçeğinin yanı sıra, bu ek açıklamada fark edilebilir başka bir şey yoktur; ama kim bilir, Bahar gelecekte ek istisnalar ekleyebilir.
Başka?
Yukarıda olduğu gibi, gelecekte Bahar için özel işlevleri ekleyebilir @Service
, @Controller
ve @Repository
bunların katman anlaşmalar esas. Bu nedenle, sözleşmeye saygı göstermek ve katmanlarla uyumlu olarak kullanmak her zaman iyi bir fikirdir.