2010-09-14 22 views
20

Tengo varios servicios:¿Cómo funcionan <context: include-filter> y <context: exclude-filter> en Spring?

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

anotado con @Service anotación. ¿Cómo puedo excluir todos los servicios menos uno?


Por ejemplo quiero usar sólo MailService. Utilizo la siguiente configuración:

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

pero ahora se excluyen todos los servicios.

Por qué se excluyen todos los servicios si existe una regla para incluir MailService?

Respuesta

12

Incluir filtros se aplican después de excluir los filtros, así que hay que combinar ambas expresiones en un filtro de exclusión. expresiones AspectJ lo permiten (& se sustituye por &amp; debido a la sintaxis XML):

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

Esta es una expresión regular, por lo que su expresión significa 'cualquier número de caracteres seguido de 'servicio'' "* servicio".. Esto excluye explícitamente el servicio de correo que desea incluir.

+0

¿a qué te refieres con "Incluir filtros aplicados después de excluir filtros"? ese filtro de exclusión se interpreta primero e incluye filtro; luego permite esos tipos a pesar de que estén definidos en el filtro de exclusión. Eso totalmente no funciona para mí – lisak

+2

@lisak: En palabras más claras: include filter no puede incluir tipos excluidos por el filtro de exclusión. – axtavt

+0

sería amable y mire este http://stackoverflow.com/q/4584509/306488? Me vuelve loco ... – lisak

10

Parece que desea utilizar el tipo de filtro "regex". He aquí un ejemplo 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

pegar código muy útil de la documentación – lisak

+0

Si Si desea incluir solo un Tipo en el escaneo de componentes, el tipo de filtro de expresiones regulares es la manera más fácil de hacerlo. – Speck

30

Otra forma de realizar este registro es con un solo filtro de inclusión.

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

el "uso-default-filtros" atributo se debe establecer en "falso" en este caso para mantener la primavera de la adición de un equivalente de filtro por defecto a

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

+1 - configuración 'use-default-filters =" false "' es clave para evitar el análisis de otros componentes en el mismo paquete base. También funciona muy bien con expresiones regulares. – lreeder

Cuestiones relacionadas