当前位置: 首页 > 面试题库 >

筛选@ComponentScan中的特定软件包

廉雅惠
2023-03-14
问题内容

我想在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


问题答案:

你只需要为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)


 类似资料:
  • 我想在Spring中从基于XML的配置切换到基于Java的配置。现在我们在应用程序上下文中有如下内容: ...它将从两个包中排除服务。我有一种强烈的感觉,我忽略了一些令人尴尬的琐碎事情,但我找不到一种解决方案来将过滤器的范围限制在。

  • 我知道关于这个问题有很多类似的问题,但是,没有一个解决了我的问题。我有一个Spring REST项目,我正在使用Spring Tool Suite(STS)3.5.1版本。 应用程序类: 这是当我尝试使用Spring Boot应用程序运行项目时得到的部分切除。

  • 我还有这个包含ID列表: 我想筛选以便筛选的不包含id来自的对象,因此我尝试使用stream: 我找不到做这件事的正确函数。有人有什么建议让我试试吗?

  • 问题内容: 我想筛选一个像这样的选择: 编辑:添加列模型: 列用于多种用途,并且为了优化我的代码,我需要将其也包含在Select中,但没有类型为“字段”或“映射”的条目 但是,我可以从所有内容中进行选择,甚至包括类型为“字段”和“地图”的条目。有没有一种清洁的方法? 问题答案: AngularJS NOT过滤器 小提琴 从 文档 : “ …谓词可以通过在字符串前面加上!来取反。” “模式对象可用于

  • 我需要wireshark的捕获筛选器,该筛选器将匹配UDP负载中的两个字节。我见过 作为匹配标准,但没有对语法的解释,而且我在任何wireshark wiki中都找不到它(大海捞针)。

  • 我有一个实体,其中一个字段是 我需要得到所有的时间表项目,其中的集合包含一个特定的组(集合可以有很多不同的组也。如果“我的组”是其中之一-它是我需要的)。 如果在没有任何条件的情况下运行代码,我可以在调试器中看到我的包含数据库中的所有项,并且每个项都包含中的组。 截图 当然,我可以“手动”找到我需要的项(例如,使用.stream()),但我肯定有一些方法可以使用谓词来获得它。