Spring IoC контейнер: сканирование classpath, использование фильтров для настройки сканирования

По умолчанию классы, аннотированные @Component, @Repository, @Service, @Controller, @Configuration или пользовательские аннотации, которые сами аннотируются @Component, являются единственными обнаруженными компонентами-кандидатами. Однако вы можете изменить и расширить это поведение, применяя пользовательские фильтры. Добавьте их как атрибуты includeFilters или excludeFilters аннотации @ComponentScan (или как дочерние элементы <context:include-filter /> или <context:exclude-filter /> элемента <context:component-scan> в конфигурации XML). Каждый элемент фильтра требует атрибутов типа и выражения. В следующей таблице описаны параметры фильтрации:

Тип фильтра Пример выражения Описание
annotation
(default)
org.example.SomeAnnotation
Аннотация, которая должна присутствовать или мета-присутствовать на уровне типа в целевых компонентах.
assignable
org.example.SomeClass
Класс (или интерфейс), которому целевые компоненты могут быть назначены (расширены или реализованы).
aspectj
org.example..*Service+
Выражение типа AspectJ, которому должны соответствовать целевые компоненты.
regex
org\.example\.Default.*
Регулярное выражение для сопоставления с именами классов целевых компонентов.
custom
org.example.MyTypeFilter
Пользовательская реализация интерфейса org.springframework.core.type.TypeFilter.

В следующем примере показана конфигурация, игнорирующая все аннотации @Repository и использующая вместо этого "заглушки" (“stub”):

Java

@Configuration
@ComponentScan(basePackages = "org.example",
        includeFilters = @Filter(type = FilterType.REGEX, pattern = ".*Stub.*Repository"),
        excludeFilters = @Filter(Repository.class))
public class AppConfig {
    ...
}

Kotlin

@Configuration
@ComponentScan(basePackages = "org.example",
        includeFilters = [Filter(type = FilterType.REGEX, pattern = [".*Stub.*Repository"])],
        excludeFilters = [Filter(Repository::class)])
class AppConfig {
    // ...
}

Следующий листинг показывает эквивалентный XML:

<beans>
    <context:component-scan base-package="org.example">
        <context:include-filter type="regex"
                expression=".*Stub.*Repository"/>
        <context:exclude-filter type="annotation"
                expression="org.springframework.stereotype.Repository"/>
    </context:component-scan>
</beans>

Вы также можете отключить фильтры по умолчанию, задав для аннотации useDefaultFilters=false или указав use-default-filters="false" в качестве атрибута элемента <component-scan/>. Это эффективно отключает автоматическое обнаружение классов, аннотированных или мета-аннотированных с помощью @Component, @Repository, @Service, @Controller, @RestController или @Configuration.


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


Комментарии

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

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

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

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