过滤在@ComponentScan特定的包(Filter specific packages in

2019-09-01 04:50发布

我想从基础到基于Java的配置在Spring XML转换。 现在,我们有这样的事情在我们的应用程序上下文:

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

但是,如果我写这样的事情...

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

......它会从两个包排除服务。 我有我俯瞰一些令人尴尬的琐碎的强烈的感觉,但我无法找到一个解决方案,以限制过滤器的范围foo.bar

Answer 1:

你只需要创建两个Config类,两个@ComponentScan您需要注解。

因此,例如,你将有一个Config为你的类foo.bar包:

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

然后第二个Config类为您foo.baz包:

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

实例Spring上下文然后当你做到以下几点:

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

另一种方法是,你可以使用@org.springframework.context.annotation.Import注释第一个Config类导入第2 Config类。 因此,例如,你可以改变FooBarConfig是:

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

那么只需在开始您的上下文有:

new AnnotationConfigApplicationContext(FooBarConfig.class)


文章来源: Filter specific packages in @ComponentScan