Spring Boot跨项目@Autowired无法识别接口实现类问题
问题核心原因
你在项目B的启动类中仅配置了@ComponentScan("com.example.projectA"),这会覆盖@SpringBootApplication默认的组件扫描逻辑——默认会扫描启动类所在包(com.example.projectB)及其子包,而手动指定扫描范围后,Spring只会扫描com.example.projectA下的组件,导致项目B中com.example.projectB.MyCustomInterfaceProvider没有被注册为Spring Bean,最终出现依赖找不到的报错。
解决方案
方案1:扩展ComponentScan扫描范围
修改项目B的启动类,让ComponentScan同时包含A和B的包:
@SpringBootApplication @ComponentScan(basePackages = {"com.example.projectA", "com.example.projectB"}) public class MyProjectBApplication { //... }
方案2:用@Import替代手动ComponentScan
保留@SpringBootApplication默认的扫描逻辑(自动覆盖com.example.projectB),通过@Import直接导入项目A中的组件:
@SpringBootApplication @Import(com.example.projectA.TestEndpoint.class) public class MyProjectBApplication { //... }
如果项目A中有多个组件,可以在A中创建一个统一的配置类:
package com.example.projectA; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration @ComponentScan public class ProjectAAutoConfiguration { }
然后在B的启动类中导入这个配置类即可:
@SpringBootApplication @Import(com.example.projectA.ProjectAAutoConfiguration.class) public class MyProjectBApplication { //... }
方案3:遵循Spring Boot自动装配规范(推荐)
这种方式适合将项目A作为通用组件Jar提供给其他项目使用,无需依赖方手动配置:
- 在项目A中创建自动配置类:
package com.example.projectA; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration @ComponentScan public class ProjectAAutoConfiguration { }
- 在项目A的
src/main/resources/META-INF目录下创建spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,内容为:
com.example.projectA.ProjectAAutoConfiguration
- 项目B的启动类只需保留默认的
@SpringBootApplication即可:
@SpringBootApplication public class MyProjectBApplication { //... }
这样项目B引入A的Jar后,Spring Boot会自动识别并加载A的自动配置类,同时默认扫描B自身的包,实现组件的自动装配。
补充说明
你提到将TestEndpoint移到项目B时能正常生效,原因是此时TestEndpoint处于com.example.projectB包下,被默认扫描范围覆盖,同时MyCustomInterfaceProvider也在同一扫描范围内,Spring能找到对应的实现类Bean完成注入。
内容的提问来源于stack exchange,提问作者YorkField

