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 注解之@Autowired、@Qualifer以及@Resource的区别