Nie, bardzo się od siebie różnią.
Obie są różnymi specjalizacjami adnotacji @Component (w praktyce są to dwie różne implementacje tego samego interfejsu), więc obie można wykryć przez skanowanie ścieżek klas (jeśli zadeklarujesz to w swojej konfiguracji XML)
Adnotacja @Service jest używana w warstwie usług i zawiera adnotacje dla klas, które wykonują zadania usługowe, często ich nie używasz, ale w wielu przypadkach używasz tej adnotacji, aby przedstawić najlepsze praktyki. Na przykład możesz bezpośrednio wywołać klasę DAO, aby utrwalić obiekt w bazie danych, ale jest to okropne. Całkiem dobrze jest wywołać klasę usług, która wywołuje DAO. Dobrze jest przeprowadzić separację wzorca obaw.
Adnotacja @Controller jest adnotacją używaną we frameworku Spring MVC (komponencie Spring Framework używanym do implementacji aplikacji internetowej). Adnotacja @Controller wskazuje, że określona klasa pełni rolę kontrolera. Adnotacja @Controller działa jako stereotyp klasy z adnotacjami, wskazując jej rolę. Dyspozytor skanuje takie klasy z adnotacjami w poszukiwaniu mapowanych metod i wykrywa adnotacje @RequestMapping.
Patrząc na architekturę Spring MVC, masz klasę DispatcherServlet (którą deklarujesz w swojej konfiguracji XML), która reprezentuje kontroler frontowy, który kieruje wszystkie żądania HTTP do odpowiednich klas kontrolerów (z adnotacją @Controller). Ta klasa realizuje logikę biznesową (i może wywoływać usługi) za pomocą swojej metody. Te klasy (lub jego metody) są zwykle opatrzone adnotacjami również z adnotacją @RequestMapping, która określa, jakie żądanie HTTP jest obsługiwane przez kontroler i jego metodę.
Na przykład:
@Controller
@RequestMapping("/appointments")
public class AppointmentsController {
private final AppointmentBook appointmentBook;
@Autowired
public AppointmentsController(AppointmentBook appointmentBook) {
this.appointmentBook = appointmentBook;
}
@RequestMapping(method = RequestMethod.GET)
public Map<String, Appointment> get() {
return appointmentBook.getAppointmentsForToday();
}
Ta klasa jest kontrolerem.
Ta klasa obsługuje wszystkie żądania HTTP kierowane do folderu „/ nominacje”, a w szczególności metoda get jest metodą wywoływaną do obsługi wszystkich żądań HTTP GET kierowanych do folderu „/ Spotkania”.
Mam nadzieję, że teraz jest to dla Ciebie bardziej jasne.
Jeśli spojrzeć na definicjach
@Controller
,@Service
adnotacji, to przekonasz się, że są to specjalny rodzaj@Component
adnotacji.@Component public @interface Service { …. }
@Component public @interface Controller { … }
Więc jaka jest różnica?
@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żesz zamienić tej adnotacji na żadną inną podobną
@Service
lub@Repository
, mimo że wyglądają tak samo. Dyspozytor skanuje klasy z adnotacjami@Controller
i wykrywa@RequestMapping
w nich adnotacje. Możesz używać tylko@RequestMapping
w@Controller
klasach z adnotacjami.@Services
trzymaj logikę biznesową i metodę wywołania w warstwie repozytorium.Co jest specjalnego w @Service?
Oprócz tego, że jest używany do wskazania, że trzyma logikę biznesową, nie ma zauważalnej specjalności, którą zapewnia ta adnotacja, ale kto wie, wiosna może w przyszłości dodać dodatkowe wyjątki.
Połączona odpowiedź: Jaka jest różnica między adnotacjami @Component, @Repository i @Service na wiosnę?
źródło
Nie,
@Controller
to nie to samo co@Service
, chociaż obie są specjalizacjami@Component
, co czyni ich kandydatami do odkrycia przez skanowanie ścieżek klas.@Service
Adnotacja jest używany w warstwie usług, a@Controller
to dla kontrolerów MVC Wiosna w swojej warstwie prezentacji.@Controller
Zwykle musiałby mapowanie adresów URL i być wywołany przez żądanie internetowej.źródło
@Service vs @Controller
@Service: klasa to „Fasada usług biznesowych” (w sensie wzorców Core J2EE) lub coś podobnego.
@Controller: wskazuje, że klasa z adnotacjami jest „kontrolerem” (np. Kontrolerem sieciowym).
---------- Znajdź przydatne notatki na temat głównych stereotypów http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/stereotype/Component.html
@interface Component
@Target(value=TYPE) @Retention(value=RUNTIME) @Documented public @interface Component
Wskazuje, że klasa z adnotacjami jest składnikiem. Takie klasy są uważane za kandydatów do automatycznego wykrywania podczas korzystania z konfiguracji opartej na adnotacjach i skanowania ścieżek klas.
Inne adnotacje na poziomie klasy również mogą być traktowane jako identyfikujące komponent, zazwyczaj jest to specjalny rodzaj komponentu: np. Adnotacja @Repository lub adnotacja @Aspect firmy AspectJ.
@interface Controller
@Target(value=TYPE) @Retention(value=RUNTIME) @Documented @Component public @interface Controller
Wskazuje, że klasa z adnotacjami jest „kontrolerem” (np. Kontrolerem sieciowym).
Ta adnotacja służy jako specjalizacja @Component, umożliwiając automatyczne wykrywanie klas implementacji poprzez skanowanie ścieżek klas. Jest zwykle używany w połączeniu z metodami obsługi z adnotacjami opartymi na adnotacji RequestMapping.
@ interfejs Usługa
@Target(value=TYPE) @Retention(value=RUNTIME) @Documented @Component public @interface Service
Wskazuje, że klasa z adnotacjami jest „Usługą”, pierwotnie zdefiniowaną przez Domain-Driven Design (Evans, 2003) jako „operację oferowaną jako interfejs, który jest samodzielny w modelu, bez stanu hermetyzacji”. Może również wskazywać, że klasa jest „Fasada usług biznesowych” (w sensie wzorców Core J2EE) lub czymś podobnym. Ta adnotacja jest stereotypem ogólnego przeznaczenia, a poszczególne zespoły mogą odpowiednio zawęzić semantykę i użycie.
Ta adnotacja służy jako specjalizacja @Component, umożliwiając automatyczne wykrywanie klas implementacji poprzez skanowanie ścieżek klas.
Repozytorium @interface
@Target(value=TYPE) @Retention(value=RUNTIME) @Documented @Component public @interface Repository
Wskazuje, że klasa z adnotacjami jest „repozytorium”, pierwotnie zdefiniowanym przez Domain-Driven Design (Evans, 2003) jako „mechanizm hermetyzacji zachowań przechowywania, pobierania i wyszukiwania, który emuluje zbiór obiektów”. Zespoły wdrażające tradycyjne wzorce J2EE, takie jak „Obiekt dostępu do danych”, mogą również zastosować ten stereotyp do klas DAO, chociaż przed zrobieniem tego należy dobrze zrozumieć różnicę między obiektem dostępu do danych a repozytoriami w stylu DDD. Ta adnotacja jest stereotypem ogólnego przeznaczenia, a poszczególne zespoły mogą odpowiednio zawęzić semantykę i użycie.
Klasa z adnotacjami w ten sposób kwalifikuje się do tłumaczenia Spring DataAccessException, gdy jest używana w połączeniu z PersistenceExceptionTranslationPostProcessor. Klasa z adnotacjami jest również wyjaśniona co do jej roli w ogólnej architekturze aplikacji pod kątem narzędzi, aspektów itp.
Od Spring 2.5 ta adnotacja służy również jako specjalizacja @Component, umożliwiając automatyczne wykrywanie klas implementacji poprzez skanowanie ścieżek klas.
źródło
Odpowiedziałem już na podobne pytanie tutaj. Oto link
Nie, oba są różne.
Adnotacje @ Service mogą być używane do innych celów, a @Controller - do innych. W rzeczywistości adnotacje Spring @Component, @Service, @Repository i @Controller są używane do automatycznego wykrywania fasoli za pomocą skanowania ścieżki klas w środowisku Spring, ale to nie oznacza, że wszystkie funkcje są takie same. @ Usługa: wskazuje, że klasa z adnotacjami jest składnikiem usługi w warstwie biznesowej.
@Controller: Klasa z adnotacjami wskazuje, że jest to składnik kontrolera, używany głównie w warstwie prezentacji.
źródło
Nie, nie możesz, oni są inni. Gdy aplikacja zostanie wdrożona, mapowania kontrolera zostaną na przykład zepsute.
Dlaczego i tak chcesz, kontroler nie jest usługą i na odwrót.
źródło
Od wiosny w akcji
źródło
Możesz zadeklarować @service jako @Controller .
NIE możesz zadeklarować @Controller jako @Service
@Usługa
To jest normalne. Właśnie deklarujesz klasę jako składnik.
@Kontroler
Jest trochę bardziej wyjątkowy niż Component. Dyspozytor wyszuka @RequestMapping tutaj. Tak więc klasa z adnotacją @Controller będzie dodatkowo uprawniona do deklarowania adresów URL, przez które wywoływane są interfejsy API
źródło
źródło