Spring DI на основе конфигурации DI против XML? - PullRequest
44 голосов
/ 08 декабря 2011

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

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

Ответы [ 7 ]

31 голосов
/ 08 декабря 2011

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

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

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

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

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

Аннотации будут очень полезны для небольших компонентов / приложений, которые не будут изменять или поддерживать разные реализации зависимости одновременно и которые вряд ли будут составлены по-разному (например, с использованием разных зависимостей для разных сборок). Простые микроуслуги вписываются в эту категорию.

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

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

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

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


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

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

11 голосов
/ 08 декабря 2011

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

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

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

9 голосов
/ 08 декабря 2011

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

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

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

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

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

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

6 голосов
/ 24 июня 2017

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

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

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

2 голосов
/ 23 октября 2015

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

1 голос
/ 12 сентября 2018

Являются ли аннотации лучше, чем XML, для настройки Spring?

Внедрение конфигураций на основе аннотаций поставило вопрос о том, является ли этот подход «лучше», чем XML.Короткий ответ - это зависит.Длинный ответ заключается в том, что у каждого подхода есть свои плюсы и минусы, и, как правило, разработчик сам решает, какая стратегия ему больше подходит.Благодаря тому, как они определены, аннотации обеспечивают много контекста в их объявлении, что приводит к более короткой и более краткой конфигурации.Тем не менее, XML превосходен при подключении компонентов без

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

Независимо от выбора, Spring может приспособить оба стиляи даже смешать их вместе.Стоит отметить, что с помощью опции JavaConfig Spring позволяет использовать аннотации неинвазивным способом, не затрагивая исходный код целевых компонентов, и что с точки зрения инструментов все стили конфигурации поддерживаются Spring Tool Suite.

Мой личный вариант - лучше использовать xml, поскольку у вас есть все в одном месте, и вам не нужно углубляться в свои пакеты для поиска в классе.

0 голосов
/ 04 марта 2019

Мы не можем сказать, какой метод хорош, это зависит от вашего проекта.Мы не можем ни избежать XML, ни аннотации.Одним из преимуществ использования xml является то, что мы можем понять структуру проекта, просто просматривая контекстные файлы xml, но аннотации сокращают объем мета-конфигурации.Поэтому я предпочитаю 30% xml и 70% аннотаций.

...