Error creating bean with name ‘XXXController’: Injection of resource dependencies failed
问题已解决:4 种高频原因全面排查指南
一、项目场景
在一次Spring Boot + MyBatis的后台项目开发过程中,项目结构、依赖、配置看似全部完成,但在启动项目时却直接报错,控制台抛出了熟悉又让人头大的异常:
Error creating bean with name ‘xxxxxxController’: Injection of resource dependencies failed项目无法启动,Controller Bean 注入失败,开发直接被“卡死”。
这种问题在 Spring Boot 项目中非常常见,尤其是在刚接触 MyBatis、XML Mapper 配置或包路径配置时,几乎人人都会踩坑。
本文将结合一次真实踩坑经历,系统性地总结 4 种最常见的错误原因,只要你逐条排查,总有一种能帮你快速定位问题。
二、问题描述
1️⃣ 项目目录结构(示例)
一个典型的 Spring Boot + MyBatis 项目结构如下:
com.example.demo ├── controller │ └── UserController.java ├── service │ ├── UserService.java │ └── impl │ └── UserServiceImpl.java ├── dao │ └── UserMapper.java ├── entities │ └── User.java └── mapper └── UserMapper.xml代码编译无误,IDEA 也不报红,但一运行项目,直接启动失败。
2️⃣ 报错信息核心提示
Error creating bean with name 'userController': Injection of resource dependencies failed本质含义只有一句话:
Spring 在创建 Controller Bean 时,无法成功注入其依赖对象(Service / Mapper)
三、原因分析(4 种高频踩坑点)
原因一:Mapper 接口缺少@Mapper注解
❌ 错误示例
publicinterfaceUserMapper{UserselectById(Longid);}Spring无法扫描到 Mapper,自然也无法注入。
✅ 正确做法
@MapperpublicinterfaceUserMapper{UserselectById(Longid);}或者在启动类统一扫描:
@MapperScan("com.example.demo.dao")@SpringBootApplicationpublicclassDemoApplication{publicstaticvoidmain(String[]args){SpringApplication.run(DemoApplication.class,args);}}原因二:Service 实现类缺少@Service注解
❌ 错误示例
publicclassUserServiceImplimplementsUserService{}接口有了,实现类却没被 Spring 托管。
✅ 正确做法
@ServicepublicclassUserServiceImplimplementsUserService{}记住一句话:
Controller 能不能注入 Service,取决于 Service 是否是 Spring Bean。
原因三:Mapper.xml 参数类型或路径映射错误
这是最容易被忽略、也最容易出问题的一类。
1️⃣ parameterType 写成类名
<selectid="selectById"parameterType="User">select * from user where id = #{id}</select>如果你这样写,就必须在配置文件中声明实体包别名。
✅ application.yml 正确配置
mybatis:type-aliases-package:com.example.demo.entities2️⃣ 不想配别名?那就写全限定名
<selectid="selectById"parameterType="com.example.demo.entities.User">二选一即可,否则必错。
原因四(最隐蔽,也是最坑的):包名大小写写错
这是我这次真正踩到的“血案级错误”。
实体类真实包名是:
com.example.demo.entitles但我在配置文件中写的是:
mybatis:type-aliases-package:com.example.demo.Entitles⚠️ 注意:
一个大写字母,就足以让路径映射彻底失效。
❌ 错误的后果
- MyBatis 找不到实体类
- Mapper.xml 加载失败
- Mapper Bean 创建失败
- Service 注入失败
- Controller 注入失败
- 最终抛出:
Injection of resource dependencies failed
四、解决方案(完整排查清单)
当你遇到这个错误时,请按下面顺序逐条检查:
✅ 1. Mapper 接口
- 是否加了
@Mapper或使用了@MapperScan
✅ 2. Service 实现类
- 是否加了
@Service - 是否放在 Spring 扫描路径下
✅ 3. Mapper.xml
namespace是否与 Mapper 接口全限定名一致parameterType / resultType是否正确- 是否配置了
type-aliases-package
✅ 4. 包名大小写
- 实体包名
- yml / properties 中配置的包名
- XML 中引用的类名
一个字符都不要想当然。
五、配置文件小建议(新手强烈推荐)
为什么推荐application.properties
- 优先级高于
application.yml - 不依赖缩进
- 不容易因为格式错误导致配置失效
示例
mybatis.type-aliases-package=com.example.demo.entities mybatis.mapper-locations=classpath:mapper/*.xml对于新手来说,容错率更高,排错成本更低。
六、总结
Injection of resource dependencies failed不是一个具体错误它只是告诉你:Spring 没法正常装配 Bean
真正的问题,往往藏在:
- 注解缺失
- XML 配置
- 路径映射
- 包名大小写
永远不要因为“感觉自己都写对了”而跳过排查。
很多时候,Bug 不是复杂,而是你没想到它可以这么简单。
希望这篇文章,能帮你少踩一次坑。