Лучше ли аннотации, чем XML, для конфигурирования Spring?

Внедрение конфигурации на основе аннотаций подняло вопрос о том, является ли данный подход "лучше", чем подход с использованием XML. Краткий ответ: "Это зависит от ситуации". Развернутый ответ заключается в том, что каждый подход имеет свои плюсы и минусы, и, как правило, разработчик сам решает, какая стратегия ему больше подходит. Благодаря способу их определения аннотации предоставляют в своем объявлении много контекста, что позволяет получить более короткую и лаконичную конфигурацию. Однако XML отлично справляется со связыванием компонентов, не затрагивая их исходный код и без их перекомпиляции. Некоторые разработчики предпочитают, чтобы инструмент связывания находился рядом с источником, в то время как другие утверждают, что аннотированные классы уже не являются POJO и, кроме того, конфигурация становится децентрализованной и ее труднее контролировать.

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

Альтернативой настройке на XML является конфигурация на основе аннотаций, которая опирается на метаданные байт-кода для подключения компонентов вместо объявлений в угловых скобках. Вместо того чтобы использовать XML для описания инструмента связывания бинов, разработчик переносит конфигурацию в сам класс компонента с помощью аннотаций для соответствующего объявления класса, метода или поля. Как упоминалось в подразделе Пример: AutowiredAnnotationBeanPostProcessor, использованиеBeanPostProcessor в сочетании с аннотациями является распространенным средством расширения IoC-контейнера Spring. Например, в Spring 2.0 появилась возможность принудительного использования требуемых свойств с помощью аннотации @Required. Spring 2.5 позволил использовать тот же общий подход для управления внедрением зависимостей с использованием Spring. По сути, аннотация @Autowired предоставляет те же возможности, которые описаны в разделе "Автоматическое обнаружение и связывание взаимодействующих объектов", но с более тонким контролем и более широкой применимостью. В Spring 2.5 также добавлена поддержка аннотаций JSR-250, таких как @PostConstruct и @PreDestroy. Для Spring 3.0 была добавлена поддержка аннотаций JSR-330 (Внедрение зависимостей для Java), содержащихся в пакете javax.inject, таких как @Inject и @Named.

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

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

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">
    <context:annotation-config/>
</beans>

Элемент <context:annotation-config/> неявно регистрирует следующие постпроцессоры:

<context:annotation-config/> ищет аннотации только для бинов в том же контексте приложения, в котором он определен. Это означает, что если вы поместите <context:annotation-config/> в WebApplicationContext для DispatcherServlet, он будет проверять наличие @Autowired бинов только в ваших контроллерах, но не в службах.