Spring @ComponentScan 注释不起作用

Posted

技术标签:

【中文标题】Spring @ComponentScan 注释不起作用【英文标题】:Spring @ComponentScan annotation doesn't work 【发布时间】: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 
   .  .  .
   

【问题讨论】:

【参考方案1】:

javadoc 说:

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

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

【讨论】:

如果您将其定义为应用程序,它位于较低级别的包中,它可以工作,但如果您将其定义在较高级别的包中,则不能。您定义它的包是parent 包,它会扫描所有children 包。 是的,我知道它适用于应用程序 - 这是我的描述中所说的:)。我的观点是,根据规范,它甚至可以与子包一起使用。 是的,我同意。根据文档,您的两个注释似乎都应该找到 ItemRepository bean。

以上是关于Spring @ComponentScan 注释不起作用的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot 无法识别多个 @ComponentScan 元注释

Spring如何知道在哪里搜索组件或Bean?

Spring 注解之@Autowired、@Qualifer以及@Resource的区别

从 Spring 中的“组合注释”中获取值

从 @ComponentScan 中排除 @Component

以编程方式注册@Component注释类