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@Componentve aramaz@Controller,@Serviceve@Repositorygenel olarak. Taranırlar çünkü kendilerine açıklama eklenirler@Component.
Sadece bir bakmaktır @Controller, @Serviceve @Repositoryaçıklama tanımları:
@Component
public @interface Service {
….
}
@Component
public @interface Repository {
….
}
@Component
public @interface Controller {
…
}
Böylece, söylemek yanlış değil @Controller, @Serviceve @Repositoryözel türleri vardır @Componentaçı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 @Componentek açıklama eklenir, bu da aynı zamanda @Components oldukları anlamına gelir . Kendi özel ek açıklamamızı tanımlar ve ek açıklama @Componenteklersek,<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 , @Repositoryişi platforma özel istisnaları yakalamak ve bunları Spring'in birleştirilmiş kontrolsüz istisnasından biri olarak yeniden atmaktır. Bunun için, PersistenceExceptionTranslationPostProcessorBahar 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, @Repositorybö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
@ControllerAçıklama özel bir sınıf bir kontrol görevi görür göstermektedir. @ControllerAçı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 @Serviceveya benzeri herhangi bir şeyle değiştiremeyiz @Repository. Dağıtıcı, açıklamalı sınıfları tarar ve açıklamalı açıklamalı açıklamaları @Controllertespit eder @RequestMapping. Biz kullanabilirsiniz @RequestMappingkimin sınıflar not eklenmiş sadece bu yöntemlerde / üzerinde @Controllerve onu edecektir DEĞİL çalışmak @Component, @Service, @Repositoryvs ...
Not: Bir sınıf zaten aracılığıyla gibi, herhangi bir alternatif yöntemle bir fasulye olarak kayıtlıysa @Beanveya içinden @Component, @Servicevb ... ek açıklamalar, daha sonra @RequestMappingsınıfı da ek not ise alınabilir @RequestMappingaçı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, @Controllerve @Repositorybunların katman anlaşmalar esas. Bu nedenle, sözleşmeye saygı göstermek ve katmanlarla uyumlu olarak kullanmak her zaman iyi bir fikirdir.