gpt4 book ai didi

spring - 过滤@ComponentScan 中的特定包

转载 作者:IT老高 更新时间:2023-10-28 13:05:36 27 4
gpt4 key购买 nike

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

最佳答案

您只需为所需的两个 @ComponentScan 注释创建两个 Config 类。

例如,您将为 foo.bar 包创建一个 Config 类:

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

然后是 foo.baz 包的第二个 Config 类:

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

然后在实例化 Spring 上下文时,您将执行以下操作:

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

另一种方法是您可以在第一个 Config 类上使用 @org.springframework.context.annotation.Import 注释来导入第二个 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)

关于spring - 过滤@ComponentScan 中的特定包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16238089/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com