我正在使用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
注释找到指定的组件,因此失败。
我正在做什么的正确方法是什么?
由于
答案 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") })