Кака такжеработать весной? - PullRequest
25 голосов
/ 14 сентября 2010

У меня есть несколько услуг:

  • 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 ?

Ответы [ 3 ]

33 голосов
/ 23 июня 2011

Еще один способ выполнить эту регистрацию с помощью одного фильтра включения.

<context:component-scan base-package="example" use-default-filters="false">
    <context:include-filter type="aspectj" expression="example..MailService*" />
</context:component-scan>

Атрибут «use-default-filters» должен быть установлен на «ложь», чтобы в Spring не добавлялся фильтр по умолчанию, эквивалентный

<context:include-filter type="annotation" 
                        expression="org.springframework.stereotype.Component"/>
13 голосов
/ 14 сентября 2010

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

<context:exclude-filter type="aspectj" 
    expression="example..*Service* &amp;&amp; !example..MailService*" />

Это регулярное выражение, поэтому ваше выражение «. * Service» означает «любое число любого символа, за которым следует« Service »». Это явно исключает MailService, который вы хотите включить.

10 голосов
/ 14 сентября 2010

Похоже, вы хотите использовать фильтр типа "регулярное выражение".Вот пример из Spring Reference :

<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>
...