Подтвердить что ты не робот

Как <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?

4b9b3361

Ответ 1

Включить фильтры применяются после фильтров исключений, поэтому вам нужно объединить оба выражения в один фильтр исключения. Выражения AspectJ позволяют (& заменяется на &amp; из-за синтаксиса XML):

<context:exclude-filter type="aspectj" 
    expression="example..*Service* &amp;&amp; !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>