Spring IoC контейнер: конфигурация контейнера на основе аннотаций

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

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

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

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

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

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

<?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>

Неявно зарегистрированные постпроцессоры включают в себя AutowiredAnnotationBeanPostProcessor, CommonAnnotationBeanPostProcessor, PersistenceAnnotationBeanPostProcessor и RequiredAnnotationBeanPostProcessor.

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


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки