部署Spring项目时出现依赖注入错误,寻求排查解决方法
先把你遇到的异常信息贴出来,方便更清晰地定位问题:
向org.springframework.web.context.ContextLoaderListener类的监听器实例发送上下文初始化事件时发生异常;org.springframework.beans.factory.BeanCreationException:创建名为'commonUtilController'的Bean失败;自动装配依赖项注入失败;嵌套异常为org.springframework.beans.factory.BeanCreationException:无法自动装配字段:private com.ems.service.common.CommonUtilService com.ems.controller.common.CommonUtilController.commonUtilService;...
我之前部署Spring项目时也碰到过几乎一模一样的问题,大概率是Spring找不到要注入的CommonUtilService Bean导致的,咱们从几个常见的排查方向入手:
1. 检查CommonUtilService是否被Spring容器管理
Spring只能注入它自己管理的Bean,所以首先确认:
- 你的
CommonUtilService实现类上有没有加@Service(或者@Component)注解?比如:@Service public class CommonUtilServiceImpl implements CommonUtilService { // 你的业务逻辑实现 } - 项目的包扫描配置有没有覆盖到
com.ems.service.common这个包?- 如果是XML配置,检查是否有正确的组件扫描标签:
<context:component-scan base-package="com.ems.service, com.ems.controller" /> - 如果是Spring Boot项目,检查启动类的
@SpringBootApplication注解是否指定了正确的扫描路径:@SpringBootApplication(scanBasePackages = {"com.ems"}) public class EmsApplication { public static void main(String[] args) { SpringApplication.run(EmsApplication.class, args); } }
- 如果是XML配置,检查是否有正确的组件扫描标签:
2. 排查是否存在多个CommonUtilService实现类
如果你的CommonUtilService接口有多个实现类,Spring会不知道该注入哪一个,这时候就会抛出自动装配失败的异常。解决方法有两种:
- 在Controller的注入字段上用
@Qualifier指定具体的Bean名称(默认Bean名称是类名首字母小写):@Controller public class CommonUtilController { @Autowired @Qualifier("commonUtilServiceImpl") // 这里填你要注入的实现类的Bean名称 private CommonUtilService commonUtilService; // ... } - 在你优先想要使用的实现类上加上
@Primary注解,告诉Spring当有多个实现时优先选这个:@Service @Primary public class CommonUtilServiceImpl implements CommonUtilService { // ... }
3. 检查是否存在循环依赖
如果CommonUtilService里面又反向注入了CommonUtilController,就会形成循环依赖,导致Spring无法创建这两个Bean。这种情况可以通过@Lazy注解延迟加载其中一个依赖来解决:
// 在CommonUtilService里注入Controller时加@Lazy @Autowired @Lazy private CommonUtilController commonUtilController;
或者调整你的代码结构,把公共逻辑抽成独立的组件,打破循环依赖。
4. 确认XML或配置类中的Bean配置是否正确
如果你是通过XML手动配置CommonUtilService的Bean,一定要检查类路径有没有拼写错误:
<bean id="commonUtilService" class="com.ems.service.common.CommonUtilServiceImpl" />
要是class属性里的类路径写错了,Spring也找不到对应的Bean。
先从第一条开始排查吧,包扫描和注解遗漏是最常见的原因,排查完这些应该就能解决问题了。
内容的提问来源于stack exchange,提问作者shivaling

