Pregunta Filtrar paquetes específicos en @ComponentScan


Quiero pasar de la configuración basada en XML a la basada en Java en Spring. Ahora tenemos algo como esto en nuestro contexto de aplicación:

<context:component-scan base-package="foo.bar">
    <context:exclude-filter type="annotation" expression="o.s.s.Service"/>
</context:component-scan>
<context:component-scan base-package="foo.baz" />

Pero si escribo algo como esto ...

 @ComponentScan(
    basePackages = {"foo.bar", "foo.baz"},
    excludeFilters = @ComponentScan.Filter(
       value= Service.class, 
       type = FilterType.ANNOTATION
    )
 )

... excluirá los servicios de ambos paquetes. Tengo la fuerte sensación de que estoy pasando por alto algo vergonzosamente trivial, pero no pude encontrar una solución para limitar el alcance del filtro a foo.bar.


32
2018-04-26 13:46


origen


Respuestas:


Simplemente necesitas crear dos Config clases, para los dos @ComponentScan anotaciones que necesita.

Entonces, por ejemplo, tendrías uno Config clase para tu foo.bar paquete:

@Configuration
@ComponentScan(basePackages = {"foo.bar"}, 
    excludeFilters = @ComponentScan.Filter(value = Service.class, type = FilterType.ANNOTATION)
)
public class FooBarConfig {
}

y luego un 2do Config clase para tu foo.baz paquete:

@Configuration
@ComponentScan(basePackages = {"foo.baz"})
public class FooBazConfig {
}

entonces, al crear una instancia del contexto Spring, harías lo siguiente:

new AnnotationConfigApplicationContext(FooBarConfig.class, FooBazConfig.class);

Una alternativa es que puedes usar el @org.springframework.context.annotation.Import anotación en el primer Config clase para importar el segundo Config clase. Entonces, por ejemplo, podrías cambiar FooBarConfig ser:

@Configuration
@ComponentScan(basePackages = {"foo.bar"}, 
    excludeFilters = @ComponentScan.Filter(value = Service.class, type = FilterType.ANNOTATION)
)
@Import(FooBazConfig.class)
public class FooBarConfig {
}

Entonces simplemente comenzarías tu contexto con:

new AnnotationConfigApplicationContext(FooBarConfig.class)

38
2018-04-26 14:37