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