Статьи

Enterprise Spring Best Practices — Часть 4. Конфигурация аннотации

 В этом выпуске Enterprise Spring Best Practices давайте рассмотрим аннотации. Несколько аннотаций стали доступны весной 2.5. В Spring 3.0 добавлены удобные механизмы обнаружения аннотаций, которые мы увидим здесь.

Доступны аннотации для внедрения зависимостей, обнаружения и создания объектов Bean, постобработки (обязательные поля, метод инициализации и т. Д.).

Аннотации могут или не могут быть обнаружены в интерфейсах Java, обратитесь к документации или JavaDoc за подробностями о том, будет ли механизм обнаружения аннотаций перемещаться вверх в иерархии классов.

Разделы


Решение по стилю аннотации



Аннотации помогают упростить настройку. Все аннотации в Java 5 и выше требуют некоторого механизма обнаружения.

В Spring у нас есть 3 стратегии для обнаружения бинов и внедрения зависимостей

  1. Открытие на основе XML
  2. JavaConfig
  3. Гибридная конфигурация

Гибридная конфигурация — это просто смешивание стандартных <bean/>объявлений XML с методами аннотации, которые обсуждаются ниже. В следующем блоге я расскажу о JavaConfig, поэтому сейчас давайте сосредоточимся на обнаружении аннотаций на основе XML.

Обнаружение аннотации из XML



Все аннотации требуют директивы обнаружения. Мы ДОЛЖНЫ знать, какие директивы XML обнаруживают определенные аннотации, иначе компоненты не будут обработаны.

Подробнее об обнаружении аннотаций в Spring см.
Справочник по аннотациям для проектов Spring.

Вариант 1 — Регистрация отдельных постпроцессоров бина

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

  • RequiredAnnotationBeanPostProcessor — ( @Required)
  • CommonAnnotationBeanPostProcessor — ( @PostConstruct, @PreDestroy, @Resourceи т. Д.)
  • AutowiredAnnotationBeanPostProcessor — ( @Autowired, @Value, @Injectи т. Д.)
  • PersistenceAnnotationBeanPostProcessor — ( @PersistenceUnit, @PersistenceContextи т. Д.)

Вариант 2 — Используйте annotation-configдирективу

Автоматически регистрирует Bean Post Processors выше.

  <context:annotation-config/>

Вариант 3 — Используйте component-scanдирективу

Автоматически регистрирует Bean Post Processors над И сканирует аннотации компонентов @Component, @Repository, @Service, @Controllerи многое другое …

  <context:context:component-scan 
      base-package="com.gordondickens.enterprisespring"/>

Сканирование компонентов приложения



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

В
applicationContext-bootstrap.xml

<context:component-scan 
  base-package="com.gordondickens.enterprisespring">
    
  <context:exclude-filter
    expression="org.springframework.stereotype.Controller"
    type="annotation"/>
</context:component-scan>

MVC компонент сканирования



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

В пределах applicationContext-webmvc.xml

<context:component-scan 
  base-package="com.gordondickens.enterprisespring"
  use-default-filters="false"/>

    <context:include-filter 
      expression="org.springframework.stereotype.Controller" 
      type="annotation"/>
</context:component-scan>

Рекомендации по сканированию компонентов



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

  • Сканирование компонентов должно быть настроено ТОЛЬКО в файле конфигурации начальной загрузки, а не в каждом файле конфигурации XML
  • НЕ включайте также <context:annotation-config/>директиву, она автоматически включается при сканировании компонента
  • НЕ начинайте сканирование с «com» ​​и / или «org», так как это отсканирует ВСЕ подпакеты во всем проекте и фляги для кандидатов!
  • Будьте максимально конкретны с пакетами
  • НЕ пересекайте границы приложения с component-scan
    • Создать applicationContext-services.xmlдля сканирования услуг
    • Создайте applicationContext-persistence.xmlдля персистентности и сущности бобов
    • Создайте applicationContext-webmvc.xmlдля персистентности и сущности бобов
    • Создать applicationContext-webservice.xmlдля бобов веб-сервиса
    • Импортируйте эти ссылки в applicationContext-bootstrap.xmlэти элементы

Зачем разделять файлы обнаружения на специфичные для слоя конфигурации?

  • Модульное тестирование проще, так как обнаружение бинов более конкретно
  • Позволяет разделить проект на несколько Jar / Wars
  • Снижает риск возникновения проблем обнаружения с широкой областью действия, избыточного сканирования и замены бинов несколькими сканерами

Подробнее об обнаружении аннотаций в Spring см. Справочник по аннотациям для проектов Spring.