Как <context: include-filter> и <context: exclude-filter> работают в Spring?
У меня есть несколько сервисов:
- example.MailService
- example.LDAPService
- example.SQLService
- example.WebService
- example.ExcelService
аннотируется аннотацией @Service
. Как я могу исключить все службы, кроме одного?
Например, я хочу использовать только MailService. Я использую следующую конфигурацию:
<context:component-scan base-package="example">
<context:include-filter type="aspectj" expression="example..MailService*" />
<context:exclude-filter type="aspectj" expression="example..*Service*" />
</context:component-scan>
но теперь все службы исключены.
Почему все службы исключены, если существует одно правило для включения MailService?
Ответы
Ответ 1
Включить фильтры применяются после фильтров исключений, поэтому вам нужно объединить оба выражения в один фильтр исключения. Выражения AspectJ позволяют (&
заменяется на &
из-за синтаксиса XML):
<context:exclude-filter type="aspectj"
expression="example..*Service* && !example..MailService*" />
Это регулярное выражение, поэтому ваше выражение ". * Сервис" означает "любое количество символов, за которыми следует" Сервис ". Это явно исключает MailService, который вы хотите включить.
Ответ 2
Другой способ выполнить эту регистрацию - с одним фильтром включения.
<context:component-scan base-package="example" use-default-filters="false">
<context:include-filter type="aspectj" expression="example..MailService*" />
</context:component-scan>
В этом случае атрибут "use-default-filters" должен быть установлен на "false", чтобы Spring не добавлял фильтр по умолчанию, эквивалентный
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Component"/>
Ответ 3
Похоже, вы хотите использовать тип фильтра "regex". Вот пример из Spring Ссылка:
<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>