В чем разница между <mvc: annotation-driven /> и <context: annotation-config /> в сервлете?


155

Я мигрирую с весны 2.5 до весны 3.

Они ввели <mvc:annotation-driven />что-то вроде черной магии. Ожидается, что это будет объявлено только в файле конфигурации сервлета.

Весной 2.5 я просто использовал <context:annotation-config />и <context:component-scan base='...'/>теги объявлен как в application-context.xmlи диспетчере сервлет конфигурация XML с соответствующими базовыми пакетами для сканирования.

Поэтому мне интересно, в чем разница между тегами в конфигурации сервлета mvc:annotation-drivenи context:annotation-configтегами, которые я могу устранить в конфигурационных файлах Spring 3?

Ответы:


150

<context:annotation-config>объявляет поддержку общих аннотаций , таких как @Required, @Autowired, @PostConstruct, и так далее.

<mvc:annotation-driven />объявляет явную поддержку для аннотаций управляемых контроллеров MVC (то есть @RequestMapping, @Controllerхотя поддержка для тех , кто является поведение по умолчанию), а также добавить поддержку декларативной проверки через @Validи сортировочное тело сообщения с @RequestBody/ ResponseBody.


3
я должен объявить context: annotation-config как в applicationContext, так и в сервлете, особенно если я использую разные базовые пакеты в теге component-scan?
glaz666

2
Да, вам нужно <context:annotation-config>в каждом контексте.
Скаффман 20.10.10

61
@skaffman: <mvc:annotation-driven>это не бессмысленно, просто неправильно названо. Фактически он настраивает поддержку новых функций Spring MVC, таких как декларативная проверка с помощью @Valid, преобразование HTTP-сообщений с @RequestBody/ @ResponseBody, новая архитектура преобразования полей и т. Д.
axtavt

5
@Richards: Обычно да, см. Blog.springsource.com/2009/12/21/…
axtavt

7
Этот ответ совершенно неверен, так как mvc: annotation-based крайне важен для преобразований и проверки. Единственная правильная и полезная вещь здесь - комментарий от @axtavt.
Конрад Гарус

36

Существует также еще некоторые детали , касающиеся использования <mvc:annotation-driven />в документации Spring . В двух словах, <mvc:annotation-driven />дает вам больший контроль над внутренней работой Spring MVC. Вам не нужно использовать его, если вам не нужна одна или несколько функций, описанных в вышеупомянутом разделе документов.

Кроме того, существуют другие «управляемые аннотациями» теги для обеспечения дополнительной функциональности в других модулях Spring. Например, <transaction:annotation-driven />разрешает использование аннотации @Transaction, <task:annotation-driven />требуется для @Scheduled et al ...


Я хотел бы видеть набор настроек в XML, которые похожи на этот тег. Однажды я уже давно сталкивался с этим примером, но он был неполным, AFAIR.
glaz666

7

mvc: annotation-driven - это тег, добавленный в Spring 3.0, который выполняет следующие действия:

  1. Конфигурирует Spring 3 Type ConversionService (альтернатива PropertyEditors)
  2. Добавлена ​​поддержка форматирования числовых полей с помощью @NumberFormat.
  3. Добавлена ​​поддержка форматирования полей даты, календаря и времени Joda с помощью @DateTimeFormat, если время Joda находится в пути к классам
  4. Добавлена ​​поддержка проверки входных данных @Controller с помощью @Valid, если поставщик JSR-303 находится в пути к классам
  5. Добавлена ​​поддержка для чтения и записи XML, если JAXB находится на пути к классам (преобразование HTTP-сообщения с помощью @ RequestBody / @ ResponseBody)
  6. Добавлена ​​поддержка чтения и записи JSON, если Джексон находится на пути к классам (по тем же строкам, что и # 5)

context: annotation-config Ищет аннотации к bean-компонентам в том же контексте приложения, в котором он определен, и объявляет поддержку всех общих аннотаций, таких как @Autowired, @Resource, @Required, @PostConstruct и т. д. и т. д.


2
Источник и более подробная информация о MVC: драйвер аннотации - spring.io/blog/2009/12/21/mvc-simplifications-in-spring-3-0
Аникет Тхакур

Итак, вы хотите сказать: если мне понадобится @Autowired, @Resource, @Required, @PostConstruct AND @RequestBody, @ResponseBody- все эти аннотации, то мне придется добавить оба этих mvc:annotation-driven context:annotation-configтега в мою конфигурацию?
R Dhaval
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.