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:

    

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