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

rlcwz9us  于 2022-12-17  发布在  Java
关注(0)|答案(9)|浏览(253)

我使用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注解指定的组件。
做我想做的事的正确方法是什么?
谢谢

42fyovps

42fyovps1#

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

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

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

ix0qys7i

ix0qys7i2#

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

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

在类引用中使用basePackageClasses说明符将告诉Spring扫描这些包(就像前面提到的 * alternative * 一样),但是这个方法既是类型安全的,又为将来的重构添加了IDE支持-这在我的书中是一个巨大的优势。
从API中阅读,Spring建议在您希望扫描的每个包中创建一个no-op标记类或接口,该标记类或接口除了用作该属性的引用之外没有其他用途。
我不喜欢标记类 (但话又说回来,它们很像包信息类),但类型安全、IDE支持和大幅减少此扫描所需的基本包数量无疑是一个更好的选择。

qzwqbdag

qzwqbdag3#

单独提供您的包名,包名需要String[]
而不是这个:

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

使用此命令:

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

2guxujil4#

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

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

如果您查看jar文件中的ComponentScan annotation.class,您将看到一个basePackages字段,它接受一个String数组

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


或者你也可以显式地提到类。它接受类的数组

Class<?>[]  basePackageClasses
nxagd54h

nxagd54h5#

您可以使用ComponentScan扫描多个软件包
@ComponentScan({"com.my.package.first","com.my.package.second"})

apeeds0o

apeeds0o6#

您还可以使用@ComponentScans注解:

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

ltqd579y7#

我用途:

@ComponentScan(basePackages = {"com.package1","com.package2","com.package3", "com.packagen"})
xcitsw88

xcitsw888#

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

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

sczxawaw9#

用途

@ComponentScan(basePackages = {"package1"}, {"package2"})

在上课前在顶部定义它。

相关问题