working scan not example context componentscan component basepackages array spring annotations

spring - not - Filtrar paquetes específicos en @ComponentScan



spring boot component scan controller (1)

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 embarazosamente trivial, pero no pude encontrar una solución para limitar el alcance del filtro a foo.bar .


Simplemente necesita crear dos clases de Config , para las dos anotaciones de @ComponentScan que necesita.

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

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

y luego una segunda clase de Config para su paquete foo.baz :

@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 puede usar la anotación @org.springframework.context.annotation.Import en la primera clase Config para importar la segunda clase de Config . Entonces, por ejemplo, podrías cambiar FooBarConfig para que sea:

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