ChatGPT解决这个技术问题 Extra ChatGPT

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

我正在使用 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 注释指定的组件。

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

谢谢

据我所知,几乎同时给出了两个正确的答案。我会接受 hage 只是因为他的分数较低,但谢谢你们俩。
如果您对 kotlin 版本有同样的疑问,请查看此stackoverflow.com/a/62818187/7747942

h
hage

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

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

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


P
Prancer

还有另一种type-safe alternative可以将基本包位置指定为字符串。 See the API here,但我也在下面进行了说明:

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

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

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

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


有人可以解释为什么 @ComponentScan({"com.app", "com.controllers"}) 对我不起作用,但 @ComponentScan(basePackageClasses ={"com.controllers"}) 确实很好用吗?我觉得写每个班级的名字很无聊
对于要扫描的包,您只需在包中指定一个类。这称为标记类。如果您需要扫描没有类的层次结构中更高的包,spring 建议使用“spring marker”接口或在该包中定义的最终类的技术,仅用于包扫描。
谢谢你。我厌倦了用 string-magic/magic-strings 追踪#wheresWaldo。
m
mprabhat

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

而不是这个:

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

用这个:

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

Java 的“什么时候是逗号分隔”、“什么时候是字符串数组”、“什么时候是字符串可变参数”拼图有时让我发疯。
s
shashwatZing

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

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

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

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

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

Class<?>[]  basePackageClasses

k
ksw

您使用 ComponentScan 扫描多个包

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


F
Farouk.ch

您还可以使用 @ComponentScans 注释:

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

请考虑在您的答案中添加解释
A
Amirtha Krishnan

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

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

感谢花费近半小时后,这是缺少的依赖项
Spring Context 是这些注解唯一需要的依赖项。
D
Dharman

我用:

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