为什么 AutoConfigurationPackages 不考虑@ComponentScan?

1 spring-boot

Spring Boot 对 Spring 数据配置的支持一般是通过org.springframework.boot.autoconfigure.data.AbstractRepositoryConfigurationSourceSupport,这个类使用下面的代码来确定扫描哪些包来存储库:

AutoConfigurationPackages.get(this.beanFactory)
Run Code Online (Sandbox Code Playgroud)

所以,基本上 Spring Data with Spring Boot 只扫描包含@EnableAutoConfigurationor的包@ImportAutoConfiguration,而不考虑@ComponentScan,这是正确的吗?

Phi*_*ebb 5

@ComponentScan注释是一个核心Spring框架的特性来搜索与注释类@Component。由于 Spring Data 存储库是接口(并且没有注释),因此@ComponentScan注释不会选择它们。

如果您使用的春天启动的春季数据外,你可以扫描使用Spring的数据仓库@EnableJpaRepositoriesbasePackages属性集。

当涉及到 Spring Boot 时,通常不需要使用@ComponentScan@EnableJpaRepositories。如果您按照建议构建代码,则组件和存储库都将被选中。

回到你最初关于AbstractRepositoryConfigurationSourceSupport. 如果您查看源代码,@SpringBootApplication您会发现它带有@ComponentScan(to find @Components) 和@AutoConfigurationPackage(via @EnableAutoConfiguration)注释。使用稍后检索的值进行@AutoConfigurationPackage设置AutoConfigurationPackages

如果要覆盖 Spring Data 搜索存储库的包(例如在测试中),则需要使用它@EnableJpaRepositories来完全覆盖自动配置。我通常不这样做,而是使用@DataJpaTest并选择我的主要配置。