Czy adnotacja Springa @Controller jest taka sama jak @Service?


80

Czy adnotacja Spring jest @Controllertaka sama jak @Service?

Mam pomysł, @Controllerktórego można użyć do URLmapowania i wywoływania logiki biznesowej.

natomiast @Servicewykorzystywane do opisywanie klasy usług, która zawiera logikę biznesową.

Czy mogę użyć @Controllerzamiast @Serviceadnotacji klasy usługi?

Odpowiedzi:


124

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.


3
Bardzo ładne wyjaśnienie. Należy wspomnieć o tym, że (at) klasy kontrolerów nie muszą mieć (at) RequestMapping, (at) RequestMapping może również być na poziomie metody.
chronometrażysta

1
Czy mogę mieszać je w jednej definicji klasy? A może lepiej wdrożyć je jako oddzielne klasy?
kensai

37

Jeśli spojrzeć na definicjach @Controller, @Serviceadnotacji, to przekonasz się, że są to specjalny rodzaj @Componentadnotacji.

@Component
public @interface Service {
    ….
}

 

@Component
public @interface Controller {
    …
}

Więc jaka jest różnica?

@Kontroler

@ControllerAdnotacja wskazuje, że dana klasa służy rolę kontrolera. @ControllerAdnotacja 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ą @Servicelub @Repository, mimo że wyglądają tak samo. Dyspozytor skanuje klasy z adnotacjami @Controlleri wykrywa @RequestMappingw nich adnotacje. Możesz używać tylko @RequestMappingw @Controllerklasach z adnotacjami.


@Usługa

@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ę?


7

Nie, @Controllerto nie to samo co @Service, chociaż obie są specjalizacjami @Component, co czyni ich kandydatami do odkrycia przez skanowanie ścieżek klas. @ServiceAdnotacja jest używany w warstwie usług, a @Controllerto dla kontrolerów MVC Wiosna w swojej warstwie prezentacji. @ControllerZwykle musiałby mapowanie adresów URL i być wywołany przez żądanie internetowej.


5

@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.


1

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.


0

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.


0

Od wiosny w akcji

Jak widać, ta klasa jest oznaczona adnotacją @Controller. Sam @Controller nie robi wiele. Jego głównym celem jest identyfikacja tej klasy jako składnika skanowania komponentów. Ponieważ HomeController jest oznaczony adnotacją @Controller, skanowanie komponentów Springa automatycznie je wykrywa i tworzy wystąpienie HomeController jako fasolę w kontekście aplikacji Spring.

W rzeczywistości kilka innych adnotacji (w tym @Component, @Service i @Repository) służy podobnemu celowi jak @Controller. Mogłeś równie skutecznie opatrzyć HomeController dowolną z tych adnotacji i nadal działałby tak samo. Wybór @Controller jest jednak bardziej opisowy dla roli tego komponentu w aplikacji.


0

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


0
  • Kontroler zajmie się nawigacją między różnymi widokami. Twoje mapowania żądań mapowania są obsługiwane za pomocą kontrolera.
  • Usługa współdziała bezpośrednio z repozytorium, w którym zwykle wykonywana jest logika biznesowa. Możesz dodawać, usuwać, usuwać itp. W warstwie usług
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.