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

时间:2012-05-29 07:09:54

标签: java spring annotations

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

实际开始是用

完成的
new AnnotationConfigApplicationContext(MyRootConfigurationClass.class);

此Configuration类使用

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

这很好用。但是我想更具体地说明我扫描的软件包,所以我试过了。

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

然而,由于错误告诉我无法使用@Component注释找到指定的组件,因此失败。

我正在做什么的正确方法是什么?

由于

8 个答案:

答案 0 :(得分:128)

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

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

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

答案 1 :(得分:37)

还有另一个类型安全的 替代,用于将基本包位置指定为String。 See the API here,但我也在下面说明:

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

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

从API中读取,Spring建议在您希望扫描的每个包中创建一个无操作标记类或接口,除了用作/通过此属性的参考之外,其他目的不起作用。

IMO,我不喜欢标记类(但是又一次,它们就像package-info类一样)但类型安全,IDE支持,并且大大减少了毫无疑问,这次扫描所需的基本软件包数量是一个更好的选择。

答案 2 :(得分:17)

单独提供您的包名称,包名称需要String[]

而不是:

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

使用此:

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

答案 3 :(得分:9)

另一种方法是使用basePackages字段;这是ComponentScan注释中的一个字段。

@ComponentScan(basePackages={"com.firstpackage","com.secondpackage"})

如果从jar文件中查看ComponentScan注释.class,您将看到一个带有字符串数组的basePackages字段

public @interface ComponentScan {
String[] basePackages() default {};
}

答案 4 :(得分:3)

使用ComponentScan使用

扫描多个包

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

答案 5 :(得分:1)

我使用:

git status -s | awk '{print $2}' >> .gitignore

答案 6 :(得分:0)

确保已在pom.xml中添加了此依赖项

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

答案 7 :(得分:0)

您还可以使用@ComponentScans批注:

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