Springdə @Component, @Service, @Controller@Repository arasındakı fərq

Zamiq Əliyev
3 min readSep 24, 2021

--

#Spring framework’ündə @Component, @Service, @Controller@Repository annotationları arasındakı fərqləri öyrənməzdən əvvəl @Component annotationunun rolunun nədən ibarət olmasını başa düşmək vacibdir. Springin ilkin buraxılışlarında bütün komponentlər XML faylında təyin olunurdu. Böyük layihələrdə bu faylın həcmi böyüdükcə oxunaqlıq itir və bu da problem yaradırdı. Spring 2.5 versiyasından başlayaraq “annotation-based dependency injection” anlayışı meydana gəldi.

Nədir bu? Xml faylında <context:component-scan> tag’ıni göstərməklə komponentləri avtomatik Spring bean olaraq tanımlayırıq. Bundan sonra qeyd etdiyim @Component annotationunu classın üstündə qeyd etməklə sözü gedən classların Spring bean olduqlarını göstəririk. Yəni artıq bu komponentləri bir-bir <bean> tag’i ilə xmldə tanımlamağa gərək qalmır. @Component annotationunu class’ın üstündə qeyd etmək kifayət edir. Artıq @Component annotationunun nə işə yaradığını bildiyimizə görə @Service, @Controller@Repository annotation’larının nə üçün lazım olduğuna nəzər salaq. Bu annotationların xüsusi şərtlərə görə tanımlanmaqdan başqa aralarında heç bir fərq yoxdur.

Spring MVC’də bir controller classında @Component istifadə etmək yerinə daha oxunaqlı və uyğun olan @Controller istifadə edirik.
Bu annotationu istifadə edərək biz 2 şeyi etmiş oluruq:

Birincisi bu classın Spring bean olduğunu və Spring ApplicationContext tərəfindən yaranıb idarə olunacağını göstəririk.
İkincisi MVC mexanizmasında bunun bir controller olduğunu göstəririk.

Məsələn, DispatcherServlet @RequestMapping sorğularını @Component annotation ilə qeyd edilən classlarda deyil, @Controller ilə qeyd edilən classlarda axtaracaq.

Bu o deməkdir ki, @Component@Controller eyni işi görür, sadəcə @Controller @Component’in daha spesifik formasıdır. Hətta siz @Controller annotationunu @Component ilə əvəzləsəniz Spring avtomatik bütün classları tapıb tanımlayacaq, ancaq bu classlar özlərini siz istədiyiniz kimi aparmaya bilər.

Eyni şey @Service@Repository annotationları üçün də keçərlidir. Bu annotationlar da @Component annotationunun xüsusi formalaşmış şəklidir.
Spring komponenti “service layer” olaraq göstəriləcəksə @Component annotationu yerinə @Service, “persistence layer” olaraq göstəriləcəksə @Repository annotationu yazılmalıdır.

Beləliklə xüsusi annotation istifadə etməklə biz “bir daşla 2 quş vurmuş olduq”. Birincisi class’ı Spring bean olaraq tanımlayırıq, ikincisi isə istifadə edəcəyimiz layer’ə görə özəllikləri istifadə edirik. Məsələn, @Repository annotationu classı bean olaraq tanımlamaqdan ziyadə həm də “Platform-specific exception”ları da tutur və onları təkrar “Spring’s unified unchecked exception” olaraq təyin edir.

Ancaq bundan ötrü siz öz kontekstinizdə org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor ‘u Spring bean olaraq tanımlamalısınız.

Yekun olaraq Spring Framework’ündə @Component, @Controller, @Service@Repository aralarında fərq olmadığını gördük. Qeyd etdiyim kimi bütün bu komponentlərin işi classı Spring bean olaraq tanımlamaqdır.Onları bir-birindən fərqləndirən əsas xüsusiyyətlər:
1. @Controller Spring MVC’də controlleri təyin etmək üçün
2. @Service biznes logikanı özündə ehtiva edən class’ı təyin etmək üçün
3. @Repository isə məlumat bazası ilə işləmək üçün
istifadə edilir.

Əlavə olaraq @Component@Bean annotationlarının fərqi:
1. @Component annotationu komponentləri avtomatik Spring bean olaraq tanımlayır, @Bean isə konkret olaraq bir komponenti tanımlayır və bunu Springin avtomatik etməsinə izn vermir.
2. @Component annotationu komponentləri classdan ayırmaz, @Bean isə komponenti classdan ayırır.
3. @Component class səviyyəsində, @Bean isə metod səviyyəsində tanımlanır, bundan başqa komponentin adını metodun adı ilə uyğun olur.
4. @Component’i @Configuration annotationu ilə birlikdə istifadə etməyə ehtiyac yoxdur, ancaq @Bean annotationu isə classın üstündə @Configuration annotationu göstərilmiş class daxilində istifadə edilir.
5. Əgər komponent Spring konteyneri daxilində deyilsə biz @Component vasitəsilə onu bean olaraq tanımlaya bilmərik, ancaq @Bean isə bizə imkan verir ki, komponent Spring konteyneri daxilində olmasa belə onu bean olaraq tanımlaya bilsin.
6. @Component annotationunun xüsusi @Service, @Controller@Repository kimi xassələri mövcuddur, @Bean isə heç bir xassəyə malik deyildir.

--

--