101

@Configuration我正在使用 Spring 3.1 并使用and@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注释指定的组件。

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

谢谢

4

8 回答 8

178

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

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

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

于 2012-05-29T07:21:12.470 回答
50

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

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

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

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

IMO,我不喜欢标记类(但话又说回来,它们与包信息类非常相似),但类型安全、IDE 支持以及大幅减少此扫描所需包含的基本包的数量毫无疑问,这是一个更好的选择。

于 2014-01-24T12:55:24.340 回答
20

单独提供你的包名,它需要一个String[]for 包名。

而不是这个:

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

用这个:

@ComponentScan({"com.my.package.first","com.my.package.second"})
于 2012-05-29T07:23:11.040 回答
12

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

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

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

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

或者您可以明确提及这些类。包含类数组

Class<?>[]  basePackageClasses
于 2016-02-10T14:19:35.210 回答
5

您使用 ComponentScan 扫描多个包

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

于 2016-11-24T07:07:41.203 回答
2

您还可以使用 @ComponentScans 注释:

@ComponentScans(value = { @ComponentScan("com.my.package.first"),
                          @ComponentScan("com.my.package.second") })
于 2019-02-16T20:48:04.140 回答
1

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

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
于 2019-02-01T10:20:08.257 回答
1

我用:

@ComponentScan(basePackages = {"com.package1","com.package2","com.package3", "com.packagen"})
于 2020-03-21T11:38:28.657 回答