Jaka jest różnica między <mvc: annotation-Based /> a <context: annotation-config /> w serwlecie?

155

Przechodzę z wersji Spring 2.5 na Spring 3.

Wprowadzili <mvc:annotation-driven />coś, co robi czarną magię. Oczekuje się, że będzie to zadeklarowane tylko w pliku konfiguracyjnym serwletu.

Wiosną 2.5 właśnie użyłem <context:annotation-config />i <context:component-scan base='...'/>zadeklarowałem tagi zarówno w application-context.xmlXML konfiguracji serwletu dyspozytora, jak i odpowiednie pakiety bazowe do skanowania.

Zastanawiam się więc, jaka jest różnica między tagami mvc:annotation-driveni context:annotation-configw konfiguracji serwletu i co mogę wyeliminować w plikach konfiguracyjnych Spring 3?

glaz666
źródło

Odpowiedzi:

150

<context:annotation-config>deklaruje poparcie dla ogólnych opisów takich jak @Required, @Autowired, @PostConstructi tak dalej.

<mvc:annotation-driven />deklaruje jawną obsługę kontrolerów MVC opartych na adnotacjach (tj. @RequestMapping, @Controllerchociaż obsługa tych jest domyślnym zachowaniem), a także dodaje obsługę deklaratywnego sprawdzania poprawności za pośrednictwem @Validi kierowania treści komunikatów za pomocą @RequestBody/ ResponseBody.

skaffman
źródło
3
czy powinienem zadeklarować context: annotation-config zarówno w applicationContext, jak i servlet, zwłaszcza jeśli używam różnych pakietów podstawowych w tagu skanowania komponentu?
glaz666
2
Tak, będziesz potrzebować <context:annotation-config>w każdym kontekście.
skaffman
61
@skaffman: <mvc:annotation-driven>nie jest bezcelowe, jest po prostu niewłaściwie nazwany. W rzeczywistości konfiguruje obsługę nowych funkcji Spring MVC, takich jak deklaratywna walidacja z @Valid, konwersja wiadomości HTTP z @RequestBody/ @ResponseBody, nowa architektura konwersji pól itp.
axtavt
5
@Richards: Zwykle tak, patrz blog.springsource.com/2009/12/21/…
axtavt
7
Ta odpowiedź jest po prostu błędna, ponieważ mvc: oparta na adnotacjach ma kluczowe znaczenie dla konwersji i walidacji. Jedyną poprawną i wartą uwagi rzeczą jest komentarz @axtavt.
Konrad Garus,
36

Istnieje również kilka szczegółów na temat stosowania <mvc:annotation-driven />w docs wiosny . Krótko mówiąc, <mvc:annotation-driven />zapewnia większą kontrolę nad wewnętrznym działaniem Spring MVC. Nie musisz go używać, chyba że potrzebujesz co najmniej jednej funkcji przedstawionej we wspomnianej sekcji dokumentacji.

Dostępne są również inne tagi „sterowane adnotacjami”, które zapewniają dodatkową funkcjonalność w innych modułach Spring. Na przykład <transaction:annotation-driven />umożliwia korzystanie z adnotacji @Transaction, <task:annotation-driven />jest wymagane dla @Scheduled et al ...

seanhodges
źródło
Chciałbym zobaczyć zestaw ustawień w xml, które są podobne do tego tagu. Kiedyś spotkałem się z tym przykładem dawno temu, ale był on niepełny, AFAIR.
glaz666
7

mvc: annotation-Based to tag dodany w wersji Spring 3.0, który wykonuje następujące czynności:

  1. Konfiguruje usługę ConversionService typu Spring 3 (alternatywa dla PropertyEditors)
  2. Dodaje obsługę formatowania pól liczbowych za pomocą @NumberFormat
  3. Dodaje obsługę formatowania pól Data, Kalendarz i Joda Time z @DateTimeFormat, jeśli Joda Time znajduje się w ścieżce klas
  4. Dodaje obsługę walidacji danych wejściowych @Controller z @Valid, jeśli dostawca JSR-303 znajduje się w ścieżce klasy
  5. Dodaje obsługę odczytu i zapisu XML, jeśli JAXB znajduje się na ścieżce klas (konwersja wiadomości HTTP z @ RequestBody / @ ResponseBody)
  6. Dodaje obsługę czytania i pisania JSON, jeśli Jackson znajduje się na ścieżce klas (według tych samych linii, co # 5)

context: annotation-config Wyszukuje adnotacje w ziarnach w tym samym kontekście aplikacji, w którym jest zdefiniowany, i deklaruje obsługę wszystkich ogólnych adnotacji, takich jak @Autowired, @Resource, @Required, @PostConstruct itp.

Praveen Kumar KS
źródło
2
Źródło i więcej szczegółów na temat mvc: adnotation
Thakur
Chcesz więc powiedzieć, że jeśli potrzebuję @Autowired, @Resource, @Required, @PostConstruct ORAZ @RequestBody, @ResponseBody- wszystkie te adnotacje, będę musiał dodać oba te mvc:annotation-driven context:annotation-configtagi w mojej konfiguracji?
R Dhaval,