2010-09-14 13 views
20

Ho diversi servizi:In che modo <context: include-filter> e <context: exclude-filter> funzionano in primavera?

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

annotato con annotazione @Service. Come posso escludere tutti i servizi tranne uno?


Ad esempio, desidero utilizzare solo MailService. Io uso la seguente configurazione:

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

ma ora tutti i servizi sono esclusi.

Perché tutti i servizi sono esclusi se esiste una regola per includere MailService?

risposta

12

Includere filtri vengono applicati dopo l'esclusione dei filtri, in modo da avere per combinare entrambe le espressioni in un unico filtro di esclusione. espressioni AspectJ lo permettono (& è sostituito dal &amp; causa di una sintassi XML):

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

Questa è un'espressione regolare, quindi la vostra espressione si intende 'qualsiasi numero di qualsiasi carattere seguito da 'servizio'' "* servizio".. Questo esclude esplicitamente il MailService che desideri includere.

+0

cosa intendi con "Includi filtri vengono applicati dopo l'esclusione dei filtri"? che il filtro di esclusione viene interpretato per primo e include il filtro, quindi consente tali tipi nonostante siano definiti nel filtro di esclusione? Questo non funziona per me in modo ottimale – lisak

+2

@lisak: In parole più chiare: include filtro non può includere tipi esclusi dal filtro di esclusione. – axtavt

+0

vorresti essere così gentile e guardare questo http://stackoverflow.com/q/4584509/306488? Mi fa impazzire ... – lisak

10

Sembra che si desideri utilizzare il tipo di filtro "regex". Ecco un esempio dalla 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

incollare il codice molto utile dalla documentazione – lisak

+0

Se si desidera includere solo un tipo nella scansione del componente il tipo di filtro regex è il modo più semplice per farlo. – Speck

30

Un altro modo per eseguire questa registrazione è con un filtro di inclusione singolo.

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

"Usa-default-filtri" attributo deve essere impostato su "false", in questo caso per mantenere primavera da aggiungere un filtro predefinito equivalente a

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

+1 - l'impostazione 'use-default-filters =" false "' è la chiave per impedire la scansione di altri componenti nello stesso pacchetto base. Funziona anche alla grande con regex. – lreeder

Problemi correlati