Главная » Spring » Включение фильтров в элемент component-scans Spring

0

Как оказывается, элемент <context:component-scan> обеспечивает зна- чительную гибкость в отношении поиска кандидатов в компоненты. Дополнительные настройки процедуры поиска можно выполнить, добавляя  элементы  <context:include-filter>  и  <context:excludefilter> в <context:component-scan>.

Для демонстрации действия фильтров в элементе component-scan посмотрим, что можно предпринять, чтобы обеспечить автоматиче- скую регистрацию всех классов, реализующих интерфейс Instrument, используя стратегию на основе аннотаций. Для этого необходимо открыть исходные тексты всех реализаций интерфейса Instrument и

пометить их аннотацией @Component (или любой другой аннотаци- ей из представленных выше). Это как минимум неудобно. А если в приложении используется сторонняя реализация Instrument, это вообще может оказаться невозможным.

Поэтому вместо использования аннотаций потребуем от элемента

<context:component-scan> автоматически зарегистрировать все классы, экземпляры которых могут присваиваться свойствам типа Instrument, добавив фильтр включения, как показано ниже:

<context:component-scan

base-package="com.springinaction.springidol">

<context:include-filter  type="assignable" expression="com.springinaction.springidol.Instrument"/>

</context:component-scan>

Атрибуты type и expression элемента <context:include-filter> в со- вокупности определяют стратегию поиска. В данном случае мы по- требовали зарегистрировать в виде компонентов Spring все классы, экземпляры которых могут присваиваться свойствам типа Instrument. Однако существуют и другие типы фильтров, которые перечислены в табл. 4.1.

Таблица 4.1. Поиск компонентов можно настраивать, используя любой из пяти типов фильтров

Тип фильтра

Описание

annotation

Отыскивает классы, отмеченные указанной аннотацией

на уровне типа. Аннотация определяется атрибутом expression

assignable

Отыскивает классы, экземпляры которого могут присваиваться свойствам указанного типа. Тип свойств определяется атрибутом expression

aspectj

Отыскивает классы, тип которых соответствует выражению типа AspectJ, указанному в атрибуте expression

custom

Использует пользовательскую реализацию org.springframework. core.type.TypeFilter, указанную в атрибуте expression

regex

Отыскивает классы, имена которых соответствуют регулярному выражению, указанному в атрибуте expression

По аналогии с элементом <context:include-filter>, определяющим классы, которые должны регистрироваться в виде компонентов, в элементе <context:component-scan> можно также использовать эле- мент <context:exclude-filter>, описывающий классы, которые не долж- ны регистрироваться. Например, чтобы зарегистрировать все реали-

зации интерфейса Instrument, кроме отмеченных пользовательской аннотацией @SkipIt:

<context:component-scan

base-package="com.springinaction.springidol">

<context:include-filter  type="assignable" expression="com.springinaction.springidol.Instrument"/>

<context:exclude-filter  type="annotation" expression="com.springinaction.springidol.SkipIt"/>

</context:component-scan>

Когда дело доходит до организации фильтрации в элементе

<context:component-scan>, его возможности становятся практически безграничны. Тем не менее чаще всего используется стратегия по умолчанию, основанная на применении аннотаций. И именно она чаще всего будет использоваться в этой книге.

Источник:   Уоллс К., Spring в действии. – М.: ДМК Пресс, 2013. – 752 с.: ил.

По теме:

  • Комментарии