2013-04-26 85 views
32

我想在Spring中从基于XML的配置切换到基于Java的配置。现在,我们有这样的事情在我们的应用程序上下文:过滤@ComponentScan中的特定软件包

<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

回答

38

您只需要为您需要的两个@ComponentScan注释创建两个Config类。实例你Spring上下文时

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

则:

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

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

,然后第2个Config类为您foo.baz包将执行以下操作:

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

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

new AnnotationConfigApplicationContext(FooBarConfig.class) 
+0

发生'Service.class'什么:

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

,那么只需在下手的情况下? – Deepen 2016-06-25 07:26:20