【问题标题】:Spring @ComponentScan annotation doesn't workSpring @ComponentScan 注释不起作用
【发布时间】:2016-06-02 14:53:14
【问题描述】:

我有带有包布局的 Spring Boot 应用程序示例:

main:
-com.foo
     Application.java       
-com.foo.services
      ItemService.java
      ItemRepository.java    
-com.foo.config
     Configuration.java
test:
-com.foo.services 
     ItemServiceIngegrationTest.java

我的集成测试无法运行,无法找到 ItemRepository bean 如果放

  @ComponentScan(basePackageClasses = { ItemService.class })

但如果我把它工作

  @ComponentScan(basePackageClasses = { Application.class })

诀窍在哪里?

规范说:

basePackageClasses() 或 basePackages()(或其别名 value()) 可以指定以定义要扫描的特定包。如果具体 未定义包,扫描将从 声明此注解的类。

@EnableAutoConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { Configuration.class })
public class ItemServiceIntegrationTest { 
    . . .
}

@org.springframework.context.annotation.Configuration
@PropertySource("classpath:application.properties")
@ComponentScan(basePackageClasses = { ItemService.class })
public class Configuration extends AbstractMongoConfiguration {
   .  .  .
}   

【问题讨论】:

    标签: java spring spring-java-config spring-mongodb component-scan


    【解决方案1】:

    javadoc 说:

    如果未定义特定包,将从声明此注解的类的包开始进行扫描。

    因此,除非定义了特定的包类,否则它会从声明 ComponentScan 的包中进行扫描。你能把它放在Application 类中吗?

    【讨论】:

    • 如果您将其定义为应用程序,它位于较低级别的包中,它可以工作,但如果您将其定义在较高级别的包中,则不能。您定义它的包是parent 包,它会扫描所有children 包。
    • 是的,我知道它适用于应用程序 - 这是我的描述中所说的:)。我的观点是,根据规范,它甚至可以与子包一起使用。
    • 是的,我同意。根据文档,您的两个注释似乎都应该找到 ItemRepository bean。
    猜你喜欢
    • 2017-06-10
    • 2014-08-14
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    相关资源
    最近更新 更多