Чи краще анотації, ніж 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 бінів тільки в твоїх контролерах, але не в службах.