Spring аннотация на основе DI vs xml конфигурации?

Недавно в нашей команде мы начали обсуждать с помощью spring аннотации в коде для определения зависимостей spring. В настоящее время мы используем context.xml для определения наших зависимостей. Не могли бы вы дать мне некоторые подсказки для любого подхода, и когда лучше использовать?

Изменить: я знаю, что это кажется дублирующим вопросом для более общего, но меня интересуют последствия аннотаций и конфигурации для инъекций зависимостей, которые, как я полагаю, будут иметь разные ответы и отношение, чем общий вопрос.

Ответ 1

После прочтения некоторых связанных постов и дальнейшего обсуждения в команде мы приходим к следующим выводам. Я надеюсь, что это будет полезно для других.

О конфигурации XML (которую мы используем до сих пор), мы решили сохранить ее для зависимостей, которые предназначены для библиотек (которые либо разрабатываются нами, либо третьими лицами). Библиотеки по определению должны предоставлять только определенные функции и могут использоваться в различных сценариях, что может не всегда включать DI. Поэтому использование аннотаций в наших библиотечных проектах приведет к тому, что библиотека DI (Spring в нашем случае) предоставит библиотеке, и это будет бесполезно, если библиотека используется без DI. Наличие дополнительных зависимостей не считается хорошей практикой среди нашей команды (в целом ИМХО). Когда мы собираем приложение, приложение имеет необходимые зависимости DI, а инъекция классов библиотеки выполняется по конфигурации. XML также хорош для предоставления макетных реализаций для многих компонентов без перекомпиляции модулей, которые будут их использовать. Это дает нам гибкость при тестировании или работе в локальной или производственной среде.

Об аннотациях мы фактически решили, что сможем использовать их, когда инжекционные компоненты не будут меняться, т.е. не будет сценариев, в которых будут использоваться различные реализации компонента. Мы решили, что аннотации будут очень полезны для небольших модулей/приложений с четкой функциональностью, которые не будут меняться или поддерживать разные реализации. Такие модули мы можем почти использовать из коробки в разных проектах без написания утомительного XML. Однако мы согласились с тем, что эти модули должны иметь зависимости, описанные в нашей технической документации, поэтому при сборке всего приложения можно иметь представление об этих зависимостях без прокрутки кода или даже загрузки модуля в среду IDE. Тем не менее, кажется, что аннотации потребуют, чтобы модуль был несколько зрелым относительно того, какие зависимости он будет использовать. Это также применимо для конфигураций классов java, который является современной альтернативой XML-контекстов Spring.

В общем случае, если наши зависимости могут отличаться для разных сценариев, или модуль может использоваться с различными компонентами, мы решили сохранить XML, а не жестко кодировать любые зависимости в таком модуле. Ясно, что ДОЛЖЕН быть правильный баланс между обоими подходами и четкая идея об использовании.


Важное обновление смешанного подхода. Недавно у нас был случай с тестовой базой, которую мы создали для нашей команды QA, которая требовала зависимости от другого проекта. Структура была разработана для использования подхода аннотации и классов конфигурации Spring, в то время как связанный с проектом проект имеет некоторые контексты xml, которые нам нужно было ссылаться. К сожалению, тестовые классы (мы использовали org.testng с поддержкой Spring) могли работать только с классами конфигурации xml или java, а не с обоими.

Эта ситуация иллюстрирует случай, когда оба подхода будут сталкиваться и четко, нужно отбросить. В нашем случае мы перенесли тестовую структуру для использования контекстов Spring xml, но другие способы использования могут означать другой путь.

Ответ 2

по моему опыту, я бы предпочел (или, скорее, вынужден ограничивать) использовать комбинацию XML и основанной на аннотации DI. Если мне нужно ввести карту элементов внутри bean, мне нужно будет определить карту util: map и autowire. Кроме того, мне нужно использовать XML DI для ввода источника данных в sessionFactory, если у меня есть несколько источников данных и т.д. Таким образом, комбинация обоих будет возмещена.

Я предпочитаю использовать компонент-сканирование для автоматического определения служб и Dao. Это сокращает много настроек (мы сокращаем файлы конфигурации примерно на 50%, переключаясь на компонентное сканирование). DI на основе аннотаций поддерживает как byName (@Resource), так и byType (@Autowired).

Короче, мой совет - пойти на арматуру обоих. Я чувствую, что больше поддержки аннотаций, безусловно, будет на картах в будущих выпусках Spring.

Ответ 3

Взгляните на этот ответ здесь: Конфигурация Xml и настройка на основе аннотаций

Короткая цитата прямо оттуда:

Аннотации имеют свое применение, но они не являются одной серебряной пулей для убить конфигурацию XML. Я рекомендую смешивать два!

Например, если использовать Spring, то полностью интуитивно использовать XML для часть инъекции зависимости вашего приложения. Это получает зависимостей кода от кода, который будет его использовать, контраст, используя какую-то аннотацию в коде, который нуждается в зависимостей делает код осведомленным об этой автоматической конфигурации.

Однако вместо использования XML для управления транзакциями, отмечая метод как транзакционный с аннотацией имеет смысл, поскольку это информация, которую, вероятно, пожелает знать программист.

РЕДАКТИРОВАТЬ: Также рассмотрим ответы здесь: Вставка Java-зависимостей: XML или аннотации Они, скорее всего, намного лучше нацелены на область ваших интересов.

Ответ 4

Некоторые преимущества использования конфигурации XML:

  • Конфигурация XML находится в одном месте, а не разбросана по всему исходному коду в случае аннотаций. Некоторые люди могут утверждать, что IDE, такие как STS, позволяют вам просматривать всю конфигурацию на основе аннотаций в одном месте, но мне никогда не нравятся зависимости от IDE.
  • Для этого потребуется немного больше усилий для написания XML-конфигурации, но это экономит много времени, когда вы ищете зависимости и пытаетесь понять проект.
  • XML сохраняет конфигурацию хорошо организованной и простой. Следовательно, легче понять, это помогает новым относительно неопытным членам команды быстро подняться.
  • Позволяет изменять конфигурацию без необходимости перекомпилировать и повторно развернуть код. Поэтому лучше, когда дело доходит до поддержки производства.

Итак, короткая конфигурация XML требует немного больших усилий, но это значительно сэкономит вам время и головную боль в больших проектах.

Ответ 5

Из моих собственных опытов аннотации лучше, чем xml-конфигурация. Я думаю, что в любом случае вы можете переопределить xmls и использовать аннотации. Кроме того, Spring 4 дает нам огромную поддержку аннотаций, мы можем переопределить безопасность от xml до аннотаций e.t.c, поэтому у нас будет не 100 строк xml, а 10 строк кода Java.