Конфигурация XML в сравнении с конфигурацией на основе аннотаций

115

В нескольких крупных проектах, над которыми я работал в последнее время, кажется, что становится все более важным выбирать тот или иной (XML или аннотацию). По мере роста проектов согласованность очень важна для ремонтопригодности.

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

Показать ещё 1 комментарий
Теги:
spring
annotations

16 ответов

181
Лучший ответ

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

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

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

Я не использовал аннотации JPA, поэтому я не знаю, насколько они хороши, но я бы сказал, что оставить отображение beans в базе данных в XML тоже хорошо, поскольку объект не должен заботиться откуда появилась его информация, нужно просто заботиться о том, что она может делать с ее информацией. Но если вам нравится JPA (у меня нет опыта с ним), непременно, идите на это.

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

  • 0
    Спасибо за отличный ответ! Мне было трудно решить, какой из них использовать. Этот ТАК ответ говорит, что они способствуют разъединению, в то время как этот пост в блоге говорит, что они способствуют тесной связи! Ваш ответ действительно прояснил проблему для меня.
  • 5
    Я бы суммировал этот совет следующим образом: используйте аннотации для АОП (например, транзакции можно рассматривать как аспект), но не используйте его для внедрения зависимостей.
Показать ещё 3 комментария
26

Здесь есть более широкая проблема, чем для внешних метаданных. Если ваша объектная модель только когда-либо будет сохраняться в одном направлении, то встроенные метаданные (т.е. Аннотации) более компактны и читабельны.

Если, однако, ваша объектная модель была повторно использована в разных приложениях таким образом, что каждое приложение захотело сохранить модель по-разному, то более экстренное использование метаданных (то есть XML-дескрипторов) становится более подходящим.

Ни один из них не лучше, и поэтому оба поддерживаются, хотя аннотации более модные. В результате, новые структуры для волос на огне, такие как JPA, имеют тенденцию уделять больше внимания им. Более зрелые API-интерфейсы, такие как native Hibernate, предлагают оба, потому что известно, что ни одного недостаточно.

14

Я всегда думаю об аннотациях как о каком-то индикаторе того, на что способен класс, или о том, как он взаимодействует с другими.

Spring Конфигурация XML, с другой стороны, для меня - это просто конфигурация

Например, информация о ip и порте прокси-сервера определенно входит в файл XML, это конфигурация времени выполнения.

Используя @Autowire, @Element, чтобы указать структуру, что делать с классом, полезно использовать аннотации.

Ввод URL-адреса в аннотацию @Webservice - это плохой стиль.

Но это только мое мнение. Линия между взаимодействием и конфигурацией не всегда понятна.

  • 0
    Аннотации и конфигурация на основе аннотаций (конфигурация Java) - это две разные вещи, и OP спрашивает о позднем, пока вы говорите о первом.
6

Я использую Spring в течение нескольких лет, и количество требуемого XML было определенно утомительным. Между новыми XML-схемами и поддержкой аннотаций в Spring 2.5 я обычно делаю следующее:

  • Использование "компонентного сканирования" для автозагрузки классов, использующих @Repository, @Service или @Component. Обычно я указываю каждое имя bean, а затем соединяю их вместе с помощью @Resource. Я считаю, что эта сантехника не меняется очень часто, поэтому аннотации имеют смысл.

  • Использование пространства имен "aop" для всех AOP. Это действительно отлично работает. Я по-прежнему использую его для транзакций, потому что размещение @Transactional по всему месту является своего рода перетаскиванием. Вы можете создавать именованные точки для методов в любой службе или репозитории и очень быстро применять рекомендации.

  • Я использую LocalContainerEntityManagerFactoryBean вместе с HibernateJpaVendorAdapter для настройки Hibernate. Это позволяет Hibernate легко автоматически обнаруживать классы @Entity в пути к классам. Затем я создаю названный SessionFactory bean, используя "factory - bean" и "factory -метод", ссылающийся на LCEMFB.

5

Я считаю, что видимость - большая победа с использованием подхода на основе XML. Я нахожу, что XML не так уж плох, учитывая различные инструменты для навигации по документам XML (т.е. Окно Visual Studio + ReSharper File Structure).

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

Я не знаю; в конце XML Hell, кажется, не так уж плохо для меня.

4

Важной частью использования подхода, основанного только на аннотациях, является то, что понятие "bean name" более или менее уходит (становится несущественным).

"bean names" в Spring формирует дополнительный уровень абстракции над классами реализации. С XML beans определены и указаны относительно их имени bean. С аннотациями на них ссылается их класс/интерфейс. (Хотя имя bean существует, вам не нужно его знать)

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

4

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

  • плюс: аннотации менее разговорчивы
  • минус: аннотации менее заметны.

Это зависит от вас, что более важно...

В общем, я бы рекомендовал выбрать один из способов и использовать его во всей закрытой части продукта...

(за некоторыми исключениями: например, если вы выбираете конфигурации на основе XML, вполне нормально использовать аннотацию @Autowire. Это смешение, но это помогает как читабельности, так и поддерживаемости)

3

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

Мой предпочтительный способ - это Java-конфигурация без (или минимальных) аннотаций. http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-java

3

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

  • Конфигурация сервера (как абсолютные пути к ресурсам на сервере): Spring XML файл
  • Ввод beans в качестве членов другого beans (или повторное использование XML-значения Spring во многих beans): Аннотации

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

3

Возможно, я ошибаюсь, но я думал, что аннотации (как в Java @Tag и С# [Attribute]) являются параметрами времени компиляции, а XML - временем выполнения. Это для меня говорит, что они не эквивалентны и имеют разные плюсы и минусы.

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

Конфигурационная информация, которая всегда будет связана с конкретным компонентом Java (класс, метод или поле), является хорошим кандидатом для представления аннотациями. Аннотации работают особенно хорошо в этом случае, когда конфигурация является основной для цели кода. Из-за ограничений аннотаций это также лучше, когда каждый компонент может иметь только одну конфигурацию. Если вам нужно иметь дело с несколькими конфигурациями, особенно теми, которые обусловлены чем-либо вне класса Java, содержащим аннотацию, аннотации могут создавать больше проблем, чем они решают. Наконец, аннотации не могут быть изменены без повторной компиляции исходного кода Java, поэтому все, что нужно переконфигурировать во время выполнения, не может использовать аннотации.

Пожалуйста, ознакомьтесь со следующими ссылками. Они также могут быть полезны.

2

В области контейнера DI я рассматриваю DI, основанный на аннотации, злоупотребляя использованием аннотации Java. Говоря это, я не рекомендую широко использовать его в вашем проекте. Если вашему проекту действительно нужна мощность контейнера DI, я бы рекомендовал использовать Spring IoC с настройкой конфигурации на основе Xml.

Если это всего лишь ради Unit-теста, разработчики должны применять шаблон Injection Inject в своем кодировании и использовать преимущества от насмешливых инструментов, таких как EasyMock или JMock, чтобы обойти зависимости.

Вы должны стараться избегать использования контейнера DI в неправильном контексте.

1

Для Spring Framework мне нравится идея использования аннотации @Component и установки опции "компонент-сканирование", чтобы Spring мог найти мой java beans, так что мне не нужно определять все мои beans в XML, а также в JavaConfig. Например, для автономного singleton java beans, который просто необходимо подключить к другим классам (с помощью интерфейса идеально), этот подход работает очень хорошо. В общем случае для Spring beans я по большей части отошел от Spring XML DSL для определения beans и теперь предпочитаю использование JavaConfig и Spring Annotations, потому что вы получаете некоторую проверку времени компиляции вашу конфигурацию и некоторую поддержку рефакторинга, которую вы не получаете с конфигурацией XML Spring. Я смешиваю их в некоторых редких случаях, когда обнаружил, что JavaConfig/Annotations не могут делать то, что доступно с использованием конфигурации XML.

Для Hibernate ORM (пока еще не используется JPA) я по-прежнему предпочитаю файлы сопоставления XML, поскольку аннотации в классах моделей домена в некоторой степени нарушают The Clean Architecture, который представляет собой архитектурный стиль слоев, который я принял за последние несколько лет. Нарушение происходит потому, что он требует, чтобы Core Layer зависел от связанных с персистентностью вещей, таких как Hibernate или JPA-библиотеки, и это делает POJO модели домена немного менее стойкой, не зная. На самом деле Core Layer не должен зависеть от какой-либо другой инфраструктуры вообще.

Однако, если The Clean Architecture не является вашей "чашкой чая", то я вижу, что есть определенные преимущества (такие как удобство и ремонтопригодность) использования аннотаций Hibernate/JPA в классах модели домена над отдельными файлами сопоставления XML.

1

Из моего опыта есть некоторые плюсы и минусы настройки аннотации:

  • Когда дело доходит до конфигурации JPA, поскольку она выполняется один раз и обычно не изменяется часто, я предпочитаю придерживаться конфигурации аннотации. Возможно, существует проблема с возможностью увидеть большую картину конфигурации - в этом случае я использую диаграммы MSQLWorkbench.
  • Конфигурация Xml очень хороша, чтобы получить более общую картину приложения, но, возможно, она громоздка, чтобы найти некоторые ошибки до времени исполнения. В этом случае примечание Spring @Configuration звучит как лучший выбор, так как оно позволяет видеть более крупную картинку, а также позволяет проверять конфигурацию во время компиляции.
  • Что касается конфигурации Spring, я предпочитаю комбинировать оба подхода: используйте аннотацию @Configuration с интерфейсами Services и Query и конфигурацией xml для данных источника данных и Spring, например context: base-package = package-package = "..."
  • Но xml-биты конфигурации java-аннотации, когда дело доходит до конфигурации потока (Spring Web Flow или Lexaden Web Flow), поскольку чрезвычайно важно видеть более общую картину всего бизнес-процесса. И это звучит громоздко, чтобы реализовать его с помощью аннотаций.

Я предпочитаю комбинировать оба подхода - аннотации java и необходимый минимальный xml, который сводит к минимуму конфигурацию ада.

1

Я использую оба. В основном XML, но когда у меня есть куча beans, которые наследуются от общего класса и имеют общие свойства, я использую аннотации для тех, в суперклассе, поэтому мне не нужно устанавливать одинаковые свойства для каждого bean, Поскольку я немного управляющий, я использую @Resource (name= "referBean" ) вместо того, чтобы просто загружать вещи (и сэкономить много неприятностей, если мне понадобится еще один bean того же класса, что и оригинал referBean).

1

Это классический вопрос "Конфигурация против Конвенции". В большинстве случаев личный вкус диктует ответ. Однако лично я предпочитаю конфигурацию (т.е. Основанную на XML) по Конвенции. ИМО IDE достаточно надежны, чтобы преодолеть некоторые из адских людей XML, которые часто ассоциируются с построением и поддерживают подход на основе XML. В конце концов, я нахожу, что преимущества Конфигурации (например, создание служебных программ для сборки, поддержки и развертывания файла конфигурации XML) в долгосрочной перспективе перевешивают Конвенцию.

  • 6
    Я думаю, что «Конфигурация против Соглашения» ортогональна этой проблеме. И Аннотации, и файлы XML имеют много разумных значений по умолчанию (соглашение), которые значительно упрощают их использование. Реальная разница - время компиляции и время выполнения, а код - вне кода.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню