跨Maven依赖项目调用含@Autowired的类时注入失败,如何解决?
你遇到的核心问题是:项目B的Spring上下文没有加载项目A中定义的DirectExchange Bean。虽然项目A里的AmqpConfig标注了@SpringBootApplication,但这个注解的扫描范围默认只覆盖其所在包及子包;而且当项目A作为依赖被引入项目B时,它的启动类(带@SpringBootApplication的类)并不会被项目B的Spring容器自动识别和加载,导致exchange()这个Bean没有被注册到项目B的容器中,最终引发注入失败。
另外注意下,你在OperatorSdkAmqpPollTests里的@Autowired private Logger logger;变量名和静态日志对象重名了,这可能会导致混淆,建议重命名为loggerBean之类的。
下面提供几种可行的解决方式,你可以根据项目场景选择:
1. 重构项目A的配置类(推荐第一步)
首先把项目A中AmqpConfig的@SpringBootApplication替换为@Configuration,因为@SpringBootApplication是用于Spring Boot项目启动类的注解,不适合作为依赖库的配置类:
@Configuration public class AmqpConfig { @Bean public Queue worksQueue() { return new Queue("queue"); } @Bean public DirectExchange exchange() { return new DirectExchange("exchange"); } }
2. 让项目B加载项目A的配置类
方式一:直接导入配置类(快速临时解决)
在项目B的启动类上使用@Import注解,直接导入项目A的AmqpConfig:
@SpringBootApplication @Import(com.minsait.cybersec.netvote.common.core.AmqpConfig.class) public class ProjectBApplication { public static void main(String[] args) { SpringApplication.run(ProjectBApplication.class, args); } }
方式二:扩大组件扫描范围
如果项目A中有多个需要被扫描的组件,可以在项目B的启动类上用@ComponentScan指定项目A的包路径:
@SpringBootApplication @ComponentScan(basePackages = { "com.your.projectb.base.package", // 项目B自己的基础包 "com.minsait.cybersec.netvote.common.core" // 项目A的包路径 }) public class ProjectBApplication { public static void main(String[] args) { SpringApplication.run(ProjectBApplication.class, args); } }
方式三:做成自动配置(适合通用组件库)
如果项目A是一个需要被多个项目依赖的通用组件,推荐使用Spring Boot的自动配置机制:
- 在项目A的
src/main/resources/META-INF/目录下创建spring.factories文件 - 在文件中添加以下内容:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.minsait.cybersec.netvote.common.core.AmqpConfig
这样项目B在引入项目A的依赖后,Spring Boot会自动加载这个配置类,无需手动导入或修改扫描范围。
3. 确保测试类被Spring管理
如果OperatorSdkAmqpPollTests是测试类,记得加上@SpringBootTest注解,让Spring容器初始化并管理这个类,否则@Autowired会失效:
@SpringBootTest public class OperatorSdkAmqpPollTests { private static final Logger logger = LoggerFactory.getLogger(OperatorSdkAmqpPollTests.class); @Autowired private Logger loggerBean; // 重命名避免和静态日志对象冲突 }
内容的提问来源于stack exchange,提问作者Guillermo Garcia

