如何使用@ComponentScan注释扫描多个路径?

2022-08-31 10:12:06

我正在使用Spring 3.1,并使用和属性引导应用程序。@Configuration@ComponentScan

实际的开始是

new AnnotationConfigApplicationContext(MyRootConfigurationClass.class);

此配置类的注释为

@Configuration
@ComponentScan("com.my.package")
public class MyRootConfigurationClass

这工作正常。但是,我想更具体地说明我扫描的软件包,所以我尝试了。

@Configuration
@ComponentScan("com.my.package.first,com.my.package.second")
public class MyRootConfigurationClass

但是,这失败了,错误告诉我它找不到使用注释指定的组件。@Component

做我所追求的事情的正确方法是什么?

谢谢


答案 1

@ComponentScan使用字符串数组,如下所示:

@ComponentScan({"com.my.package.first","com.my.package.second"})

当您仅在一个字符串中提供多个包名称时,Spring会将其解释为一个包名称,因此找不到它。


答案 2

还有另一种类型安全的替代方法,可以将基本包位置指定为 String。请参阅此处的 API,但我也在下面进行了说明:

@ComponentScan(basePackageClasses = {ExampleController.class, ExampleModel.class, ExmapleView.class})

basePackageClasses 规范符与类引用一起使用将告诉 Spring 扫描这些包(就像上面提到的替代方法一样),但是这种方法既可以是类型安全的,又为将来的重构添加了 IDE 支持 - 这在我的书中是一个巨大的优势。

从API中读取,Spring建议在您希望扫描的每个包中创建一个no-op标记类或接口,除了用作此属性的参考之外,没有其他用途。

IMO,我不喜欢标记类(但话说回来,它们几乎就像包信息类一样),但是类型安全,IDE支持以及大大减少此扫描所需的基本包的数量,毫无疑问,这是一个更好的选择。


推荐