我正在使用 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
注释指定的组件。
做我所追求的正确方法是什么?
谢谢
@ComponentScan 使用字符串数组,如下所示:
@ComponentScan({"com.my.package.first","com.my.package.second"})
当您只在一个字符串中提供多个包名时,Spring 会将其解释为一个包名,因此无法找到它。
还有另一种type-safe alternative可以将基本包位置指定为字符串。 See the API here,但我也在下面进行了说明:
@ComponentScan(basePackageClasses = {ExampleController.class, ExampleModel.class, ExmapleView.class})
使用带有类引用的 basePackageClasses 说明符将告诉 Spring 扫描这些包(就像提到的替代方法一样),但是这种方法既是类型安全的,又为未来的重构添加了 IDE 支持——在我的书中是一个巨大的优势。
从 API 中读取,Spring 建议在您希望扫描的每个包中创建一个无操作标记类或接口,除了用作此属性的引用之外,没有其他用途。
IMO,我不喜欢标记类(但话又说回来,它们与包信息类非常相似),但类型安全、IDE 支持以及大幅减少此扫描所需包含的基本包的数量毫无疑问,这是一个更好的选择。
单独提供您的包名称,包名称需要 String[]
。
而不是这个:
@ComponentScan("com.my.package.first,com.my.package.second")
用这个:
@ComponentScan({"com.my.package.first","com.my.package.second"})
另一种方法是使用 basePackages
字段;这是 ComponentScan 注释内的一个字段。
@ComponentScan(basePackages={"com.firstpackage","com.secondpackage"})
如果您从 jar 文件中查看 ComponentScan 注释 .class,您将看到一个 basePackages 字段,该字段接受字符串数组
public @interface ComponentScan {
String[] basePackages() default {};
}
或者您可以明确提及这些类。包含类数组
Class<?>[] basePackageClasses
您使用 ComponentScan 扫描多个包
@ComponentScan({"com.my.package.first","com.my.package.second"})
您还可以使用 @ComponentScans 注释:
@ComponentScans(value = { @ComponentScan("com.my.package.first"),
@ComponentScan("com.my.package.second") })
确保您已在 pom.xml 中添加此依赖项
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
我用:
@ComponentScan(basePackages = {"com.package1","com.package2","com.package3", "com.packagen"})
不定期副业成功案例分享