2010-09-14 13 views
20

Mam kilka usług:W jaki sposób <context: include-filter> i <context: exclude-filter> działają na wiosnę?

  • example.MailService
  • example.LDAPService
  • example.SQLService
  • example.WebService
  • example.ExcelService

opatrzona adnotacją z adnotacją @Service. Jak mogę wykluczyć wszystkie usługi oprócz jednego?


Na przykład chcę użyć tylko usługi MailService. Używam następującej konfiguracji:

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

, ale teraz wszystkie usługi są wykluczone.

Dlaczego wszystkie usługi są wykluczone, jeśli istnieje jedna reguła obejmująca MailService?

Odpowiedz

12

zawierają filtry są stosowane po wykluczyć filtrów, więc trzeba połączyć oba wyrażenia w jedno wyklucza filtr. Wyrażenia AspectJ na to pozwalają (& zastępuje &amp; powodu składni XML):

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

To regex, więc wyrażenie oznacza «dowolny numer charakteru następnie«usługa»» „* obsługa.”. To wyraźnie wyklucza usługę MailService, którą chcesz dołączyć.

+0

co masz na myśli "Filtry uwzględnienia są stosowane po filtrach wykluczających"? który filtr wykluczeń jest interpretowany jako pierwszy i uwzględnia filtr, a następnie zezwala na te typy, mimo że są zdefiniowane w filtrze wykluczającym? To zupełnie nie działa dla mnie – lisak

+2

@lisak: Bardziej wyraźne słowa: filtr włącz nie może zawierać typów wykluczonych przez filtr wykluczania. – axtavt

+0

Czy byłbyś bardzo uprzejmy i spojrzał na to http://stackoverflow.com/q/4584509/306488? To mnie doprowadza do szału ... – lisak

10

Wygląda na to, że chcesz użyć filtru typu "regex". Oto przykład z 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> 
+0

Bardzo pomocny wklejania kodu z dokumentacji – lisak

+0

If chcesz uwzględnić tylko jeden typ w skanie komponentu, a typ filtru regex to najłatwiejszy sposób. – Speck

30

Innym sposobem wykonania tej rejestracji jest użycie jednego filtra włączenia.

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

„Use-default-filtry” atrybut musi być ustawiony na „false” w tym przypadku zachować wiosnę z dodaniem równowartość domyślny filtr do

<context:include-filter type="annotation" 
         expression="org.springframework.stereotype.Component"/> 
+11

+1 - ustawienie 'use-default-filters =" false "' jest kluczem do zapobiegania skanowaniu innych komponentów w tym samym pakiecie podstawowym. Działa również świetnie z regex. – lreeder

Powiązane problemy