Can @Component
, @Repository
a @Service
adnotacje być stosowane zamiennie wiosną lub dają one żadnej konkretnej funkcjonalności oprócz działającego jako urządzenie notacji?
Innymi słowy, jeśli mam klasę usługi i zmienię adnotację z @Service
na @Component
, czy nadal będzie zachowywać się w ten sam sposób?
Czy adnotacja wpływa również na zachowanie i funkcjonalność klasy?
java
spring
spring-mvc
annotations
Colin McCree
źródło
źródło
Odpowiedzi:
Z wiosennej dokumentacji :
źródło
@Service
to także@Component
(ponieważ@Service
sama adnotacja jest opatrzona adnotacją@Component
). O ile mi wiadomo, nic w ramach Spring nie korzysta z faktu, że coś jest@Service
, więc różnica jest naprawdę tylko konceptualna.Ponieważ wiele odpowiedzi już wskazuje, do czego służą te adnotacje, skupimy się tutaj na niewielkich różnicach między nimi.
Różnice między @Component, @Repository, @Controller i @Service
Jest to stereotypowa adnotacja ogólnego przeznaczenia wskazująca, że klasa jest komponentem sprężynowym.
Co jest specjalnego w @Component,
<context:component-scan>
tylko skanuje@Component
i nie szuka@Controller
,@Service
i@Repository
ogólnie. Są skanowane, ponieważ sami są opatrzone adnotacjami@Component
.Wystarczy przyjrzeć się
@Controller
,@Service
a@Repository
definicje adnotacji:Dlatego nie jest to złe
@Controller
,@Service
a@Repository
są to specjalne typy@Component
adnotacji.<context:component-scan>
podnosi je i rejestruje następujące klasy jako fasolę, tak jakby były opatrzone adnotacjami@Component
.Adnotacje specjalnego typu są również skanowane, ponieważ same są opatrzone
@Component
adnotacjami, co oznacza, że są również adnotacjami@Component
. Jeśli zdefiniujemy własną adnotację i opatrzymy ją adnotacją@Component
, zostanie ona również zeskanowana za pomocą<context:component-scan>
Oznacza to, że klasa definiuje repozytorium danych.
Co jest specjalnego w @Repository?
Oprócz wskazania, że jest to konfiguracja oparta na adnotacjach ,
@Repository
zadaniem jest wychwycenie wyjątków specyficznych dla platformy i ponowne ich wyrzucenie jako jednego ze zunifikowanych niesprawdzonych wyjątków Springa. W tym celu zapewniamyPersistenceExceptionTranslationPostProcessor
, że musimy dodać w kontekście naszej aplikacji Spring w następujący sposób:Ten postprocesor komponentu bean dodaje doradcę do każdego komponentu bean, który jest opatrzony adnotacjami, dzięki
@Repository
czemu wychwytywane są wyjątki specyficzne dla platformy, a następnie ponownie zgłaszane jako jeden z niesprawdzonych wyjątków dostępu do danych Springa.@Controller
Adnotacja wskazuje, że dana klasa służy rolę kontrolera.@Controller
Adnotacja działa jako stereotypu dla klasy adnotacjami, wskazując swoją rolę.Co jest specjalnego w @Controller?
Nie możemy zamienić tej adnotacji na inne, podobne
@Service
lub@Repository
, nawet jeśli wyglądają tak samo. Dyspozytor skanuje klasy opatrzone adnotacjami@Controller
i wykrywa metody opatrzone@RequestMapping
adnotacjami. Możemy użyć@RequestMapping
na / w tylko tych metod, których klasy są opatrzone@Controller
i to nie działa z@Component
,@Service
,@Repository
etc ...Uwaga: Jeśli klasa jest już zarejestrowana jako fasola za pomocą dowolnej metody alternatywnej, np. Poprzez
@Bean
lub poprzez@Component
,@Service
itp. Adnotacje,@RequestMapping
można ją wybrać, jeśli klasa jest również opatrzona@RequestMapping
adnotacjami. Ale to inny scenariusz.@Service
komponenty bean przechowują logikę biznesową i metody wywoływania w warstwie repozytorium.Co jest specjalnego w @Service?
Poza faktem, że jest używany do wskazania, że trzyma logikę biznesową, w tej adnotacji nie ma nic więcej zauważalnego; ale kto wie, wiosna może dodać w przyszłości dodatkowe wyjątki.
Podobny do powyższego, w przyszłości Wiosna może dodać specjalne funkcje dla
@Service
,@Controller
i@Repository
na podstawie swoich konwencjach kolejności nakładania. Dlatego zawsze dobrze jest przestrzegać konwencji i używać jej zgodnie z warstwami.źródło
@Controller
adnotacji. Nie jest wymagane, jeśli klasa jest opatrzona adnotacjami,@RequestMapping
a komponent bean tej klasy jest tworzony w jakikolwiek sposób. Każda fasola opatrzona adnotacją@Controller
OR@RequestMapping
będzie uczestniczyć w mapowaniu żądań Spring MVC. Może to być przydatne na przykład do tworzenia kontrolerów programowo (np. Przy użyciu@Bean
metod), a jednocześnie, aby uniemożliwić Springowi próby ich utworzenia przez skanowanie pakietów (jeśli pakiet nie może zostać wykluczony ze skanowania).Są prawie takie same - wszystkie oznaczają, że klasa to fasola wiosenna.
@Service
,@Repository
I@Controller
są wyspecjalizowane@Component
s. Możesz zdecydować się na wykonanie określonych czynności z nimi. Na przykład:@Controller
fasola jest używana przez spring-mvc@Repository
Fasola kwalifikuje się do tłumaczenia wyjątków trwałościInną rzeczą jest to, że komponenty przypisujesz semantycznie do różnych warstw.
Jedną z rzeczy, które
@Component
oferuje, jest możliwość dodawania adnotacji do innych adnotacji, a następnie używanie ich w taki sam sposób jak@Service
.Na przykład ostatnio zrobiłem:
Tak więc wszystkie klasy opatrzone adnotacjami
@ScheduledJob
to fasola wiosenna, a ponadto są rejestrowane jako prace kwarcowe. Musisz tylko podać kod, który obsługuje konkretną adnotację.źródło
@Component jest równoważne z
@Service, @Controller, @Repository = {@Component + kilka innych specjalnych funkcji}
Oznacza to, że usługa, kontroler i repozytorium są funkcjonalnie takie same.
Trzy adnotacje służą do oddzielania „warstw” w aplikacji,
Teraz możesz zapytać, dlaczego je rozdzielić: (Zakładam, że znasz programowanie zorientowane na aspekt AOP)
Powiedzmy, że chcesz monitorować tylko aktywność warstwy DAO. Napisasz klasę Aspect (klasa A), która rejestruje trochę przed i po wywołaniu każdej metody DAO, możesz to zrobić za pomocą AOP, ponieważ masz trzy różne warstwy i nie są mieszane.
Możesz więc rejestrować metody DAO „wokół”, „przed” lub „po” metodami DAO. Możesz to zrobić, bo przede wszystkim miałeś DAO. Właśnie osiągnąłeś oddzielenie problemów lub zadań.
Wyobraź sobie, że gdyby była tylko jedna adnotacja @Controller, wówczas ten komponent będzie miał dyspozytorską, logikę biznesową i dostęp do bazy danych wszystkie mieszane, więc brudny kod!
Powyżej wspomniany jest jeden bardzo częsty scenariusz, istnieje wiele innych przypadków użycia trzech adnotacji.
źródło
@Respository
Ma jednak także funkcję automatycznego tłumaczenia wyjątków. Podobnie jak w przypadku wystąpienia wyjątku w,@Repository
zwykle istnieje procedura obsługi tego wyjątku i nie ma potrzeby dodawania bloków try catch w klasie DAO. Jest używany wraz z PersistenceExceptionTranslationPostProcessorWiosną
@Component
,@Service
,@Controller
, i@Repository
są adnotacje Stereotyp, które są wykorzystywane do:@Controller:
gdzie twoje mapowanie żądań ze strony prezentacji zostało wykonane, tj. warstwa prezentacji nie przejdzie do żadnego innego pliku, trafi bezpośrednio do@Controller
klasy i sprawdzi żądaną ścieżkę w@RequestMapping
adnotacji, która została napisana przed wywołaniem metody, jeśli to konieczne.@Service
: Cała logika biznesowa jest tutaj, tj. Obliczenia związane z danymi i wszystko. Jest to adnotacja warstwy biznesowej, w której nasz użytkownik nie wywołuje bezpośrednio metody utrwalania, więc wywoła tę metodę za pomocą tej adnotacji. Będzie żądał @Repository zgodnie z żądaniem użytkownika@Repository
: Jest to warstwa trwałości (warstwa dostępu do danych) aplikacji, która była używana do pobierania danych z bazy danych. tzn. wszystkie operacje związane z bazą danych są wykonywane przez repozytorium.@Component
- Opisz swoje pozostałe komponenty (na przykład klasy zasobów REST) stereotypem komponentu.źródło
odniesienie: - Dokumentacja wiosenna - Skanowanie ścieżek klas, zarządzanie komponentami i pisanie konfiguracji przy użyciu Java
źródło
Technicznie
@Controller
,@Service
,@Repository
wszystkie są takie same. Wszystkie się przedłużają@Component
.Z kodu źródłowego Spring:
Wskazuje, że klasa z adnotacjami jest „składnikiem”. Takie klasy są uważane za kandydatów do automatycznego wykrywania w przypadku korzystania z konfiguracji opartej na adnotacjach i skanowania ścieżki klas.
Możemy korzystać bezpośrednio
@Component
dla każdego fasoli, ale dla lepszego zrozumienia i konserwacji dużej aplikacji używamy@Controller
,@Service
,@Repository
.Cel każdej adnotacji:
@Controller
-> Klasy opatrzone adnotacjami, mają na celu otrzymanie żądania od strony klienta. Pierwsze żądanie przychodzi do serwletu dispatchera, skąd przekazuje żądanie do konkretnego kontrolera za pomocą wartości@RequestMapping
adnotacji.@Service
-> Klasy opatrzone adnotacjami, służą do manipulacji danymi, które otrzymujemy od klienta lub pobieramy z bazy danych. Cała manipulacja danymi powinna odbywać się na tej warstwie.@Repository
-> Klasy opatrzone adnotacjami, przeznaczone są do łączenia się z bazą danych. Można go również uznać za warstwę DAO (Data Access Object). Ta warstwa powinna być ograniczona tylko do operacji CRUD (tworzenie, pobieranie, aktualizowanie, usuwanie). Jeśli wymagana jest jakakolwiek manipulacja, dane powinny zostać wysłane z powrotem do warstwy @Service.Jeśli wymienimy ich miejsce (użyj
@Repository
zamiast@Controller
), nasza aplikacja będzie działać poprawnie.Głównym celem zastosowania trzech różnych
@annotations
jest zapewnienie lepszej modułowości aplikacji Enterprise.źródło
controller and repository
Zastosowanie
@Service
i@Repository
adnotacje są ważne z punktu widzenia połączenia z bazą danych.@Service
dla wszystkich typów usług DB połączeń DB@Repository
dla wszystkich zapisanych połączeń proc DBJeśli nie użyjesz odpowiednich adnotacji, możesz napotkać wyjątki zatwierdzania zastąpione przez transakcje wycofania. Podczas testu obciążenia skrajnego zostaną wyświetlone wyjątki związane z wycofywaniem transakcji JDBC.
źródło
@Repository
jest specjalnie zaprojektowany do pracy z warstwą trwałości. Jeśli pracujesz z interfejsem API odpoczynku - pracujesz z DTO, a nie DAO.@Repository @Service i @Controller służą jako specjalizacja @Component do bardziej szczegółowego wykorzystania na tej podstawie, możesz zastąpić @Service @ @Component, ale w tym przypadku stracisz specjalizację.
źródło
wszystkie te adnotacje są typem adnotacji typu stereo, różnica między tymi trzema adnotacjami jest
na przykład
@Service
lub@Repositroy
lub@Controller
adnotacja domyślnie@Component
adnotacją będzie istnienie na szczycie klasyźródło
Sprężyna zapewnia cztery różne rodzaje komponentów auto adnotacji skanowania, są
@Component
,@Service
,@Repository
i@Controller
. Technicznie nie ma między nimi żadnej różnicy, ale każda adnotacja automatycznego skanowania komponentu powinna być używana do specjalnego celu i w obrębie określonej warstwy.@Component
: Jest to podstawowa adnotacja automatycznego skanowania komponentu, wskazuje, że klasa z adnotacjami jest komponentem automatycznego skanowania.@Controller
: Klasa z adnotacjami wskazuje, że jest to komponent kontrolera i jest używany głównie w warstwie prezentacji.@Service
: Wskazuje, że klasa z adnotacjami jest komponentem usługi w warstwie biznesowej.@Repository
: Musisz użyć tej adnotacji w warstwie trwałości, działa to jak repozytorium bazy danych.Należy wybrać bardziej wyspecjalizowaną formę
@Component
dodawania adnotacji do ich klasy, ponieważ adnotacja ta może zawierać określone zachowanie w przyszłości.źródło
Możemy odpowiedzieć na to pytanie zgodnie ze standardem Java
Nawiązując do
JSR-330
, który jest teraz obsługiwany przez wiosnę, możesz użyć tylko@Named
do zdefiniowania fasoli (Jakoś@Named=@Component
). Tak więc zgodnie z tym standardem, nie wydaje się, że nie ma sensu definiować stereotypy (jak@Repository
,@Service
,@Controller
) do kategorii fasoli.Ale wiosenne użytkowanie tych różnych adnotacji dla różnych zastosowań, na przykład:
aspect-oriented
, mogą być dobrym kandydatem napointcuts
)@Repository
adnotacja doda funkcjonalność twojej fasoli (niektóre automatyczne tłumaczenie wyjątków na twoją warstwę trwałości fasoli).@RequestMapping
można go dodawać tylko do klas, które są opatrzone adnotacjami@Controller
.źródło
Adnotuj inne komponenty za pomocą @Component, na przykład klasy zasobów REST.
@Component to ogólny stereotyp dla dowolnego komponentu zarządzanego przez Spring.
@Controller, @Service i @Repository to Specjalizacje @Component dla określonych przypadków użycia.
@Component na wiosnę
źródło
Nie ma różnicy między
@Component
,@Service
,@Controller
,@Repository
.@Component
to ogólna adnotacja reprezentująca składnik naszego MVC. Będzie jednak kilka składników w ramach naszej aplikacji MVC, takich jak składniki warstwy usług, składniki warstwy trwałości i składniki warstwy prezentacji. Aby je rozróżnić, ludzie wiosną podali również pozostałe trzy adnotacje.@Repository
@Service
@Controller
@Component
dla nich wszystkich.źródło
Nawet jeśli wymienimy @Component lub @Repository lub @service
Będzie zachowywać się tak samo, ale jednym aspektem jest to, że nie będziemy w stanie wychwycić jakiegoś konkretnego wyjątku związanego z DAO zamiast Repozytorium, jeśli użyjemy komponentu lub usługi @
źródło
Spring 4, najnowsza wersja:
źródło
@Component : adnotacja klasy
@Component
, hibernacja mówi, że jest to Fasola.@Repository : adnotujesz klasę
@Repository
, hibernuje, że jest to klasa DAO i traktujesz ją jak klasę DAO. Oznacza to, że niesprawdzone wyjątki (wyrzucone z metod DAO) kwalifikują się do tłumaczenia na wiosnęDataAccessException
.@ Usługa : Mówi hibernacji, że jest to klasa usługi, w której będziesz mieć
@Transactional
adnotacje warstwy usługi itp., Więc hibernacja traktuje ją jako komponent usługi.Plus
@Service
wyprzedza@Component
. Załóżmy, że nazwa klasy komponentu bean brzmiCustomerService
, ponieważ nie wybrano sposobu konfiguracji komponentu bean XML, więc@Component
oznaczono go jako adnotację jako komponent bean . Zatem podczas pobierania obiektuCustomerService cust = (CustomerService)context.getBean("customerService");
komponentu bean Spring domyślnie zapisuje małą literę pierwszego znaku komponentu - od „CustomerService” do „customerService”. Możesz pobrać ten komponent o nazwie „customerService”. Ale jeśli użyjesz@Service
adnotacji dla klasy fasoli, możesz podać konkretną nazwę fasoli przezi możesz zdobyć obiekt fasoli
źródło
@Component
to ogólna adnotacja najwyższego poziomu, która powoduje, że fasola z adnotacjami ma być skanowana i dostępna w kontenerze DI@Repository
jest specjalną adnotacją i zapewnia funkcję konwertowania wszystkich niezaznaczonych wyjątków od klas DAO@Service
jest specjalną adnotacją. jak dotąd nie przynosi żadnej nowej funkcji, ale wyjaśnia intencję fasoli@Controller to specjalistyczna adnotacja, która uświadamia fasolę MVC i umożliwia korzystanie z dalszych adnotacji, takich jak
@RequestMapping
i wszystkich innychOto więcej szczegółów
źródło
A,
@Service
aby zacytować dokumentację wiosenną,Jeśli spojrzysz na projektowanie oparte na domenach autorstwa Erica Evansa,
i
Repository
według Erica Evansa,źródło
Odpowiednie odpowiedzi są wystarczające, aby wyjaśnić adnotacje dotyczące różnicy między repozytorium składników repozytorium. Chciałbym podzielić się różnicą między
@Controller & @RestController
@Controller
vsRestController
@RestController
:@Controller
której automatyczne dodawanie@Controller
i@ResponseBody
adnotacje są dodawane . więc nie musimy dodawać@ResponseBody
do naszych metod mapowania. To znaczy@ResponseBody
domyślnie jest aktywny.@RestController
, nie możesz zwrócić widoku (UżywającViewresolver
w Spring / Spring-Boot)@RestController
konwertuje również odpowiedź,JSON/XML automatically
ponieważ@ResponseBody
powoduje, że zwrócone obiekty stają się czymś, co może znajdować się w ciele,e.g. JSON or XML
@Controller
@Controller
służy do oznaczania klas jako kontrolera Spring MVC. Ta adnotacja to tylko specjalna wersja@Component
i pozwala na automatyczne wykrywanie klas kontrolerów na podstawie skanowania ścieżki klas.@Controller
możesz zwrócić widok w Spring web MVC.Bardziej szczegółowy widok
źródło
Repozytorium i usługa są potomkami adnotacji o komponentach . Wszystkie są więc komponentowe . Repozytorium i usługa po prostu je rozbuduj. Jak dokładnie? Usługa ma tylko różnicę ideologiczną: używamy jej do usług. Repozytorium ma określoną procedurę obsługi wyjątków.
źródło
Wyjaśnienie stereotypów:
@Service
- Adnotuj wszystkie klasy usług za pomocą @Service. Ta warstwa zna jednostkę pracy. Cała logika biznesowa będzie w klasach usług. Zasadniczo metody warstwy usług są objęte transakcją. Możesz wykonać wiele wywołań DAO z metody usługi, jeśli jedna transakcja się nie powiedzie, wszystkie transakcje powinny zostać wycofane.@Repository
- Adnotuj wszystkie klasy DAO za pomocą @Repository. Cała logika dostępu do bazy danych powinna być w klasach DAO.@Component
- Opisz swoje pozostałe komponenty (na przykład klasy zasobów REST) stereotypem komponentu.@Autowired
- Pozwól Springowi automatycznie łączyć inne ziarna do twoich zajęć, używając adnotacji @Autowired.@Component
to ogólny stereotyp dla dowolnego komponentu zarządzanego przez Spring.@Repository
,@Service
i@Controller
są specjalizacjami@Component
dla bardziej szczegółowych przypadków użycia, na przykład odpowiednio w warstwach trwałości, obsługi i prezentacji.Pierwotnie odpowiedziano tutaj .
źródło
Różnica między adnotacjami @Component, @Repository, @Controller i @Service
@Controller
= @Komponent (adnotacja wewnętrzna) + Funkcje warstwy prezentacji@Service
= @Komponent (adnotacja wewnętrzna) + Funkcje warstwy usługi@Component
= Rzeczywiste komponenty (komponenty)@Repository
= @Komponent (adnotacja wewnętrzna) + Funkcje warstwy danych (używaj do obsługi komponentu Domain Bean)źródło
Na wiosnę dostępne są specjalne typy adnotacji, zwane adnotacjami stereotypowymi. Są to:
powyżej zadeklarowane adnotacje są wyjątkowe, ponieważ kiedy dodamy
<context:component-scan>
do pliku xxx-servlet.xml, wiosna automatycznie utworzy obiekt tych klas, które są opatrzone powyższymi adnotacjami podczas fazy tworzenia / ładowania kontekstu.źródło
@Component
,@ Repository
,@ Service
,@Controller
:@Component
Jest to ogólny stereotyp dla składników zarządzanych przez sprężynę@Repository
,@Service
i@Controller
są@Component
specjalizacje bardziej konkretnych zastosowań:@Repository
za wytrwałość@Service
dla usług i transakcji@Controller
dla kontrolerów MVCDlaczego warto korzystać
@Repository
,@Service
,@Controller
ponad@Component
? Możemy oznaczyć nasze klasy komponentów znakiem @Component, ale jeśli zamiast tego użyjemy alternatywy, która dostosowuje się do oczekiwanej funkcjonalności. Nasze klasy są lepiej dostosowane do funkcjonalności oczekiwanej w każdym konkretnym przypadku.Klasa opatrzona adnotacją
@Repository
ma lepsze tłumaczenie i czytelną obsługę błędów w org.springframework.dao.DataAccessException. Idealny do implementacji komponentów uzyskujących dostęp do danych (DataAccessObject lub DAO).Klasa z adnotacjami
@Controller
pełni rolę kontrolera w aplikacji Spring Web MVCKlasa z adnotacjami
@Service
odgrywa rolę w usługach logiki biznesowej, np. Wzór fasady dla DAO Manager (fasada) i obsługa transakcjiźródło
Odpowiedzi przedstawione tutaj są w dużej mierze poprawne technicznie, ale mimo że lista odpowiedzi jest długa i będzie na dole, pomyślałem, że warto tu też podać poprawną odpowiedź, na wypadek, gdyby ktoś się na nią natknął i nauczył się czegoś cennego to. Nie chodzi o to, że pozostałe odpowiedzi są błędne, po prostu nie mają racji. I, aby powstrzymać hordy trolli, tak, wiem, że technicznie te adnotacje są w rzeczywistości tym samym i najbardziej wymienne aż do wiosny 5. A teraz właściwa odpowiedź:
Te trzy adnotacje to zupełnie różne rzeczy i nie można ich zamieniać. Możesz to powiedzieć, ponieważ są trzy z nich, a nie tylko jeden. Nie są przeznaczone do wymienności, są po prostu zaimplementowane w taki sposób, aby nie były eleganckie i wygodne.
Współczesne programowanie to inwencja, sztuka, technika i komunikacja w różnych proporcjach. Bit komunikacji jest zwykle bardzo ważny, ponieważ kod jest zwykle odczytywany znacznie częściej niż zapisywany. Jako programista nie tylko próbujesz rozwiązać problem techniczny, ale także komunikujesz swoją intencję przyszłym programistom, którzy czytają Twój kod. Ci programiści mogą nie dzielić twojego języka ojczystego, ani twojego środowiska społecznego, i możliwe, że będą czytać Twój kod 50 lat w przyszłości (nie jest to tak mało prawdopodobne, jak myślisz). Trudno jest skutecznie komunikować się tak daleko w przyszłość. Dlatego bardzo ważne jest, abyśmy używali najczystszego, najbardziej wydajnego, poprawnego i komunikatywnego języka, jaki jest nam dostępny.
Na przykład istotne jest, aby
@Repository
używać go, gdy piszemy repozytorium, a nie@Component
. To drugie jest bardzo złym wyborem adnotacji do repozytorium, ponieważ nie oznacza, że patrzymy na repozytorium. Możemy założyć, że repozytorium jest również fasolą szparagową, ale nie że komponent jest repozytorium. Dzięki temu@Repository
jesteśmy klarowni i konkretni w naszym języku. Mówimy jasno, że jest to repozytorium. Z@Component
pozostawiamy czytelnikowi decyzję o tym, jaki typ komponentu czytają, i będą musieli przeczytać całą klasę (i ewentualnie drzewo podklas i interfejsów), aby wywnioskować znaczenie. Klasa mogłaby zostać błędnie zinterpretowana przez czytelnika w odległej przyszłości jako nie będąca repozytorium, i bylibyśmy częściowo odpowiedzialni za ten błąd, ponieważ my, którzy doskonale wiedzieliśmy, że to repozytorium, nie sprecyzowaliśmy w naszym języku i skutecznie komunikować nasze zamiary.Nie będę wchodził w inne przykłady, ale stwierdzę tak jasno, jak to tylko możliwe: te adnotacje to zupełnie inne rzeczy i powinny być odpowiednio stosowane, zgodnie z ich intencją.
@Repository
dotyczy repozytoriów pamięci i żadna inna adnotacja nie jest poprawna.@Service
dotyczy usług i żadna inna adnotacja nie jest poprawna.@Component
dotyczy komponentów, które nie są ani repozytoriami, ani usługami, a użycie jednego z nich zamiast niego byłoby również nieprawidłowe. Może się kompilować, może nawet uruchamiać i zdawać testy, ale byłoby źle i pomyślałbym mniej o tobie (profesjonalnie), gdybyś to zrobił.Są tego przykłady przez całą wiosnę (i ogólnie programowanie). Nie można używać
@Controller
podczas pisania interfejsu API REST, ponieważ@RestController
jest on dostępny. Nie wolno używać,@RequestMapping
gdy@GetMapping
jest prawidłową alternatywą. Itd. Itd. Itd. Państwo musi wybrał najbardziej szczegółowy i dokładny poprawny język można komunikować intencję do swoich czytelników, w przeciwnym razie, to wprowadzamy ryzyka w systemie, a ryzyko wiąże się z kosztami.źródło
Aby uprościć tę ilustrację, rozważmy technicznie przypadek użycia. Te adnotacje są używane do wstrzykiwania i, jak powiedziałem dosłownie „ Używany do wstrzykiwania ”, to znaczy, jeśli wiesz, jak korzystać z wstrzykiwania zależności „DI”, a ty powinieneś, wtedy zawsze będziesz szukać tych adnotacji, a poprzez adnotowanie klas tymi typami stereo , informujesz pojemnik DI, aby zeskanował go, aby był gotowy do wstrzyknięcia w inne miejsca, jest to praktyczny cel.
Teraz przejdźmy do każdego; najpierw @ Usługa , jeśli budujesz logikę dla konkretnego przypadku biznesowego, musisz oddzielić ją w miejscu zawierającym logikę biznesową, ta usługa jest klasyczna lub możesz jej użyć jako interfejsu, jeśli chcesz, i jest napisana jak to
Wszystkie są w ten sam sposób, gdy je wstrzykujesz, @Repository to interfejs, który stosuje implementację wzorca repozytorium Wzorzec projektu repozytorium , na ogół jest używany, gdy masz do czynienia z jakimś magazynem danych lub bazą danych, a przekonasz się, że zawiera wiele gotowa implementacja do obsługi operacji na bazie danych; może to być CrudRepository , JpaRepository itp.
Wreszcie @Component , jest to ogólna forma dla zarejestrowanych ziaren na wiosnę, to wiosna zawsze szuka fasoli oznaczonej @Component do rejestracji, wtedy zarówno @Serwis, jak i @Repository są szczególnymi przypadkami @Component, jednak częsty przypadek użycia bo komponent ma miejsce wtedy, gdy robisz coś czysto technicznego, a nie do bezpośredniego uzasadnienia biznesowego! takie jak formatowanie dat lub przekazywanie specjalnego mechanizmu serializacji żądań i tak dalej.
źródło
@Component działa jak adnotacja @Bean w klasie konfiguracji, rejestruj komponent bean w kontekście wiosennym. Jest także nadrzędny dla adnotacji @Service, @Repository i @Controller.
@Service , rozszerza adnotację @Component i ma tylko różnicę w nazewnictwie.
@Repository - rozszerza adnotację @Component i tłumaczy wszystkie wyjątki bazy danych na DataAccessException .
@Controller - działa jako kontroler we wzorze MVC. Dyspozytor przeskanuje takie klasy z adnotacjami w poszukiwaniu metod mapowanych, wykrywając adnotacje @RequestMapping.
źródło
Są to wszystkie adnotacje StereoType. Przydają się one do tworzenia naszych klas jako fasoli szparagowej w pojemniku ioc,
źródło