2011-01-05 14 views
6

Jak rozumiem, istnieją dwie główne korzyści z adnotacjami kontrolerów w Spring:Dlaczego preferowane są kontrole w Spring z tradycyjnymi mapowaniami?

  1. Eliminacja konieczności rozszerzenia klasy bazowej/implementować interfejs.
  2. Eliminacja jeszcze innego pliku konfiguracyjnego.

Wydaje się to przyniesie dwie główne wady, jednakże:

  1. Sprzężenie między ramami a kontrolerem wydaje się mocniej z wykorzystaniem adnotacji, w porównaniu z wykorzystaniem przedłużacza klasa/realizacji.
  2. Pojedynczy plik zawierający odwzorowania wydaje się łatwiejszy w utrzymaniu, niż przekopywanie się przez kod w wielu plikach w poszukiwaniu adnotacji.

Chociaż osobiście uważam wyżej wymienione wady za przewyższające korzyści, wydaje się, że preferowane jest stosowanie adnotacji. To prowadzi mnie do pytania: dlaczego kontrolery z komentarzem do Spring preferowane są do tradycyjnych mapowań?

Edycja w odniesieniu do sprzęgła:

Zdaję sobie sprawę, że w obu przypadkach istnieje pewne sprzężenie z podstawowej ramy zaangażowanych. Interfejs Controller wymagany przez Spring składa się z jednej metody i może być w większości wyodrębniony (np. interface MyController extends SpringController). Adnotacje z drugiej strony, oprócz tego, że są specyficzne dla danej struktury, wymagają całego zestawu importów w każdym pliku.

+1

Lepsze pytanie brzmi dla mnie: "dlaczego SpringSource dokumentuje tylko podejście do adnotacji w instrukcji obsługi?". Usunęli dokumentację konfiguracji MVC w stylu XML, co jest dla mnie irytujące. – skaffman

+2

@ Annaffman Yup, jest to jedna z najlepszych części źródła wiosny: [Classic Spring MVC] (http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/classic -spring.html # clasic-spring-mvc) :-) –

+1

@Sean: Bah. ZAWIEŚĆ. – skaffman

Odpowiedz

1

Nie sądzę, że jeden plik jest łatwiejszy do utrzymania. Duży, który znalazłem, to adnotacje, które pozwalają ci używać obiektów w więcej niż projekcie i przynoszą ze sobą swoją konfigurację. Nie muszę edytować źródła, a następnie zapamiętać każdy projekt, który go używa i naprawić pliki konfiguracyjne. Tworzy bardziej modułowy sposób myślenia i rozwoju.

1
  1. Sprzęgło jest luźniejsze. Klasa z adnotacjami nie jest zależna od metod lub interfejsów klasy nadrzędnej i może zostać zamknięta w klasie zgodnej z dowolną strukturą, jeśli później zdecydujesz się na migrację. Nadal będziesz musiał usunąć adnotacje dla większości kompilatorów, ale kod i logika nie będą musiały zostać zmienione, a jedynie uzupełnione, aby zapewnić parametry i przepływ połączeń w sposób podobny do Spring @ MVC.

  2. To zależy od rodzaju i skali konserwacji, czy jest bardziej destrukcyjne niż inne. Jeśli chcesz zmienić konfigurację dla wielu elementów, bardziej irytujące jest przesiewanie różnych plików java w konfiguracji z adnotacjami. Podczas gdy refaktoryzacja kontrolera i adresów URL ulegnie zmianie, robienie tego w klasie java będzie mniej uciążliwe niż edycja osobnego pliku xml (który zawiera wiele wierszy, które nie dotyczą wprowadzanej zmiany).

2

Istnieje kilka dodatkowych zalet:

  • Logiczne grupowanie kilku działań w jednej klasie kontrolera (choć możliwe jest również z MultiActionController, ale nie tak elastyczny)

  • Uproszczenie testowanie jednostkowe, ponieważ w większości przypadków można przekazywać proste argumenty i nie trzeba przygotowywać się na próbę s. HttpServletRequest/HttpServletResponse s.

  • Dodatkową elastyczność mapowania z @RequestParam, @PathVariable, etc (choć może to być realizowane w tradycyjnych kontrolerów, ale nie sądzę tak eleganckie, jak z powodu adnotacji statycznego charakteru tradycyjnych kontrolerów).

Również nie mogę się zgodzić z pierwszą wadą - moim zdaniem adnotacje wprowadzają znacznie mniej sprzężeń niż dziedziczenie. Na przykład można nawet używać skompilowanego kontrolera z adnotacjami jako zwykłej klasy bez Spring w ścieżce klasy (chociaż kompilacja kodu źródłowego z komentarzem nadal wymaga adnotacji w ścieżce budowania).

+1

wspomnę tylko, że test sprężynowy dostarcza wymaganych prób dla zapytania/odpowiedzi. Ale mimo wszystko lepiej bez nich. – Bozho

+0

Występuje błąd kompilacji, jeśli nie zaimportuję odpowiedniego kodu źródłowego, aby obsługiwał moje adnotacje. – etheros

+0

@etheros: Miałem na myśli skompilowany formularz. W postaci skompilowanej nieznane adnotacje są ignorowane. – axtavt

2

Pozwól mi polemizować z wad:

  1. nie. Jest to metadane, które można łatwo usunąć bez wpływu na funkcjonalność. Z drugiej strony konieczność rozszerzenia niektórych klas i użycia ich metod uniemożliwia późniejsze pozbywanie się frameworka.

  2. To jest to samo. Użyłem obu podejść, i nie jest źle. Dzięki nowoczesnym funkcjom przeszukiwania IDE i odpowiednim konwencjom nazewnictwa brak pojedynczego pliku konfiguracyjnego jest równie łatwy.

1

Oprócz istniejących odpowiedzi, czuję, że to warto wspomnieć, że wiosna MVC ma czystą separację pomiędzy obsługi odwzorowań i obsługi adapterów.

Dawne dyktuje który obsługi jest powoływać się na dany wniosek, a druga określa jak że handler powinien być wywoływany.

Jednym z najbardziej ekstremalnych jest "klasyczny" Spring MVC z odwzorowaniami zdefiniowanymi w XML i adapterem zdefiniowanym przez starą klasę hierarchii klasy Controller. Z drugiej strony masz @Controller i @RequestMapping ze wszystkim, co zdefiniowano w adnotacjach.

Jest jednak całkowicie dopuszczalne mieszanie i łączenie. Na przykład można zdefiniować odwzorowania adresów URL w języku XML, "w starym stylu", ale nadal korzystać z niezaangażowanych klas obsługujących @Controller. W ten sposób unikasz umieszczania odwzorowań adresów URL w adnotacjach (co nie zawsze jest dobre), które zachowują znacznie ulepszoną elastyczność podpisów klas (i zmniejszoną zależność od Spring API) adnotacji.

Ta umiejętność łączenia podejść oznacza, że ​​możesz zdefiniować podejście, które najlepiej Ci odpowiada.

Powiązane problemy