Java Spring在组件扫描中考虑了哪些包

Java Spring在组件扫描中考虑了哪些包,java,spring,spring-boot,Java,Spring,Spring Boot,我有一个spring boot应用程序,它使用标记接口定义应用于组件扫描的包: @ComponentScan(basePackageClasses = {ModelComponents.class, WebComponents.class, ServiceComponents.class}) 在ModelComponents下的包中,定义了一个接口,该接口用作服务,并在ServiceComponents中有其实现,但不知何故没有被提取 在spring包上使用调试级调试(VM选项:-dlogin

我有一个spring boot应用程序,它使用标记接口定义应用于组件扫描的包:

@ComponentScan(basePackageClasses = {ModelComponents.class, WebComponents.class, ServiceComponents.class})
ModelComponents
下的包中,定义了一个接口,该接口用作服务,并在
ServiceComponents
中有其实现,但不知何故没有被提取

在spring包上使用调试级调试(VM选项:
-dloging.level.org.springframework=debug
),我可以看到前两个组件中的所有Springbean都被提取,但第三个组件中没有

启用此调试信息比限制为中所述的更具体的包提供更多输出,但我从中得到的只是日志输出,如:

DEBUG | .c.a.ClassPathBeanDefinitionScanner |                        | Identified candidate component class: file [...\ActivityLogService.class]
DEBUG | .c.a.ClassPathBeanDefinitionScanner |                        | Identified candidate component class: file [...TopayMwApplicationProperties.class]
DEBUG | .c.a.ClassPathBeanDefinitionScanner |                        | Identified candidate component class: file [...ChallengeService.class]
这告诉了我找到的所有bean,但它没有给出任何关于其他bean的提示:它们在哪里没有找到,是因为忽略了包,还是spring查看了基本包却没有找到bean

是否有方法获取组件扫描考虑的包或使用的标记接口的信息


这在日志中是如何识别的?

在这里,Spring将在您指定的那些类的包下查找组件。我的意思是Spring将搜索ModelComponents.class包、WebComponents.class包和ServiceComponents.class包下的组件。所以

  • 如果您的实现类不在这些包中,那么它将被忽略
  • 如果您的实现类没有被注释为Spring组件,那么它将被忽略

  • 显然,无法通过日志检索此信息。类
    org.springframework.context.annotation.ComponentScanAnnotationParser
    将注释中的
    basePackageClasses
    数组解析为
    parse
    方法中的包数组

    对该问题的调试表明,我使用了3个marker接口类,但只使用了2个包

    由于问题中的示例不是真实的示例,它没有显示全部事实,这导致了问题:有两个标记接口具有相同的名称,但一个位于另一个的子包中,子包中的一个被导入并在
    basePackageClasses
    中使用了两次


    因此,上面一个包中的bean不在扫描的包中。

    您提交的代码看起来是正确的,尽管其他评论者提到这可能是您的类放置问题。 我用于设置要扫描的包的代码如下:

    scanBasePackages = {"ru.company.package", "ru.company.anotherpackage"}
    

    尽管由于可能的打字错误,它不太安全,但它会显式地设置程序包,并可能为您提供有关错误的更多信息。

    @M.Deinum该程序已关闭,现在已被删除,由于它缺少一些细节,说明它不是重复的,我知道这一点,我的服务用
    Service
    注释,并且在同一个包(或子包)中为什么不使用basePackages而不是basePackageClasses?因为使用类型是重构安全的:如果重命名包,可能会忘记更新basePackages中的字符串,尽管某些IDE对此有点支持。我明白了。为什么不让Spring通过不在@ComponentScan注释中定义任何包或类来自动定位它们呢。然后它会自动识别配置类和子包的同一个包下的每个组件。