2010-09-14 1 views
20

J'ai plusieurs services:Comment <context: include-filter> et <context: exclude-filter> fonctionnent-ils dans Spring?

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

annoté avec l'annotation @Service. Comment puis-je exclure tous les services sauf un? Par exemple, je veux utiliser seulement MailService. J'utilise la configuration suivante:

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

mais maintenant tous les services sont exclus.

Pourquoi tous les services sont-ils exclus s'il existe une règle à inclure MailService?

Répondre

12

Inclure les filtres sont appliqués après les filtres d'exclusion, donc vous devez combiner les deux expressions dans un filtre d'exclusion. expressions AspectJ permettent (& est remplacé par &amp; en raison de la syntaxe XML):

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

C'est une expression régulière, de sorte que votre expression de « toute nombre de caractère suivi par « Service » » « * de service. ». Cela exclut explicitement le MailService que vous souhaitez inclure.

+0

que voulez-vous dire "Inclure les filtres sont appliqués après exclure les filtres"? ce filtre d'exclusion est interprété en premier et inclure le filtre puis permet à ces types malgré qu'ils sont définis dans le filtre d'exclusion? Cela ne fonctionne pas totalement pour moi – lisak

+2

@lisak: En termes plus clairs: le filtre d'inclusion ne peut pas inclure les types exclus par le filtre d'exclusion. – axtavt

+0

seriez-vous s'il vous plaît si gentil et regardez ce http://stackoverflow.com/q/4584509/306488? Cela me rend fou ... – lisak

10

Il semble que vous vouliez utiliser le type de filtre "regex". Voici un exemple de la 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

code coller très utile de la documentation – lisak

+0

Si vous souhaitez inclure un seul type dans l'analyse des composants, le type de filtre regex est le moyen le plus simple de le faire. – Speck

30

Une autre façon d'effectuer cette inscription est avec un seul filtre d'inclusion.

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

L'attribut « utiliser des filtres-default- » doit être réglé sur « false » dans ce cas, pour maintenir ressort d'ajouter un filtre par défaut équivalent à

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

+1 - la définition 'use-default-filters =" false "' est la clé pour empêcher l'analyse des autres composants dans le même paquet de base. Fonctionne également très bien avec regex. – lreeder