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)