核心是Spring容器未创建或无法匹配目标Bean;先看异常类型定位是创建失败还是根本不存在,再查注解、扫描路径、MapperScan配置,最后验证Bean列表并排查多实例、作用域及循环依赖问题。

遇到 Bean 注入失败,比如报错 No qualifying bean of type 'X' 或 UnsatisfiedDependencyException,核心是 Spring 容器里压根没创建你要的那个 Bean,或者创建了但类型/名称不匹配。别急着改代码,按顺序查这几点最有效。
看错误日志,先定位根因
控制台报错通常很长,重点盯两处:
- 最上面的异常类型:是
BeanCreationException还是NoSuchBeanDefinitionException?前者说明 Bean 创建过程中出错了(比如构造失败、初始化异常),后者说明容器里根本没这个 Bean 定义。 - 最下面的
Caused by:它才是真正的“第一原因”。比如你看到Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'userMapper' available,那问题就锁定在 Mapper 没被扫描或没生成代理类。
确认 Bean 是否真的被 Spring 管理
一个类光有 @Service 或 @Component 不够,还得进得了 Spring 的眼:
- 检查注解是否写对:类上必须有
@Component及其衍生注解(@Service、@Repository、@Controller),且不能是private类或抽象类。 - 核对组件扫描路径:Spring Boot 默认只扫主启动类所在包及其子包。如果你的 Service 在
com.example.service,而启动类在com.example,那就没问题;但如果 Service 在com.other.service,就必须用@ComponentScan("com.other")显式声明。 - MyBatis 用户特别注意:
@MapperScan的路径必须覆盖你的 Mapper 接口位置,且不能漏掉子包。常见错误是写成@MapperScan("com.example.mapper.UserMapper")(这是类名,不是包名),正确写法是@MapperScan("com.example.mapper")。
验证容器里有没有这个 Bean
启动时加个参数,让 Spring 把所有 Bean 都打出来:
- 在
application.properties里加一行:spring.main.print-all-beans=true - 或者启动命令加参数:
--spring.main.print-all-beans - 启动后看控制台输出的 Bean 列表,搜索你的类名或接口名。如果完全找不到,说明扫描或注册环节就失败了;如果找到了但名字不对(比如是
userMapper而你注入的是UserMapper),就要检查@Qualifier或命名约定。
检查依赖冲突和作用域问题
有时候 Bean 存在,但注入还是失败:
- 多个同类型 Bean:接口有多个实现类时,Spring 不知道选哪个。解决方法是在目标实现类上加
@Primary,或注入时用@Qualifier("beanName")明确指定。 - 作用域不兼容:把
@Scope("prototype")的 Bean 注入到单例 Bean 里,可能引发意外行为。除非有明确需要,普通业务类保持默认单例即可。 - 循环依赖:A 依赖 B,B 又依赖 A。Spring 默认只支持单例 Bean 间的 setter 或字段注入循环依赖。如果用了构造器注入,或者涉及原型 Bean,就会直接报错。可考虑用
@Lazy延迟加载其中一个。


















