26 Stimmen

Wie funktionieren <context:include-filter> und <context:exclude-filter> in Spring?

Ich habe mehrere Dienste:

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

kommentiert mit @Service Bemerkung. Wie kann ich alle Dienste außer einem ausschließen?

Ich möchte zum Beispiel nur Folgendes verwenden MailService . Ich verwende die folgende Konfiguration:

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

aber jetzt sind alle Dienste ausgeschlossen.

Warum werden alle Dienste ausgeschlossen, wenn es eine Regel zur Einbeziehung gibt? MailService ?

34voto

David Punkte 1231

Eine andere Möglichkeit, diese Registrierung durchzuführen, ist die Verwendung eines einzelnen Einschlussfilters.

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

Das Attribut "use-default-filters" muss in diesem Fall auf "false" gesetzt werden, um zu verhindern, dass Spring einen Standardfilter hinzufügt, der

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

14voto

axtavt Punkte 233070

Einschließende Filter werden nach ausschließenden Filtern angewendet, daher müssen Sie beide Ausdrücke zu einem ausschließenden Filter kombinieren. AspectJ-Ausdrücke erlauben dies ( & wird ersetzt durch &amp; aufgrund der XML-Syntax):

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

Dies ist ein Regex, d.h. Ihr Ausdruck ".*Service" bedeutet 'eine beliebige Anzahl von Zeichen, gefolgt von "Service"'. Dies schließt den MailService, den Sie einschließen möchten, ausdrücklich aus.

11voto

earldouglas Punkte 13012

Es sieht so aus, als ob Sie den Filtertyp "regex" verwenden möchten. Hier ist ein Beispiel aus dem Frühling Referenz :

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X