过滤@ComponentScan中的特定包

时间:2013-04-26 13:46:30

标签: spring annotations

我想在Spring中从基于XML的配置切换到基于Java的配置。现在我们在应用程序上下文中有这样的东西:

<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的解决方案。

1 个答案:

答案 0 :(得分:39)

您只需要为您需要的两个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注释导入第二个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)