本质是spring容器未注册目标bean,启动时抛nosuchbeandefinitionexception等异常;需按“有没有”“找不找得到”“为什么找不到”三层排查:检查注解、扫描范围、注入方式匹配性,并用applicationcontext验证。

Bean 找不到的注入异常,本质是 Spring 容器里压根没注册你要的那个类型或名称的 Bean。它通常在启动阶段就报错,比如 NoSuchBeanDefinitionException 或 UnsatisfiedDependencyException,而不是运行时 NPE。排查要从“有没有”“找不找得到”“为什么找不到”三层推进。
确认目标类是否被 Spring 管理
这是最基础也最容易忽略的一环:
- 检查类上是否加了
@Component、@Service、@Repository、@Controller或@Configuration等注解;如果是 Mapper 接口,确认用了@Mapper或配置了@MapperScan - 如果类在独立模块(如 common 包)中,确保该模块已正确引入,且其类路径未被混淆工具(如 Proguard)删掉注解或类名
- 避免手动
new XxxService()—— 这种对象不在容器里,Spring 对它完全不可见
验证组件扫描范围是否覆盖目标类
Spring Boot 默认只扫描主启动类所在包及其子包:
- 若目标类在
com.example.service,而启动类在com.example.app,那没问题;但如果在com.other.module,就必须显式配置@ComponentScan(basePackages = "com.other.module") - 使用
@MapperScan时,路径必须精确匹配 Mapper 接口所在包,不能漏掉子包,也不能写错大小写 - 多模块项目中,常见问题是:common 模块 install 后未触发自动扫描,需检查依赖传递和
spring-boot-maven-plugin配置
检查注入方式与上下文匹配性
即使 Bean 存在,也可能因注入方式不匹配而失败:
- 用
@Autowired时,Spring 按类型查找;若接口有多个实现类,会抛NoUniqueBeanDefinitionException,此时需配合@Qualifier或@Primary - 用
@Resource时,默认按名称查找(字段名),名称不一致就会找不到;可显式指定name = "xxxService" - 静态字段、静态代码块、构造器中直接调用注入字段,会导致 NPE——因为注入发生在构造完成之后,不是初始化时机问题而是生命周期错位
用 ApplicationContext 主动验证 Bean 是否存在
这是最直接的实锤手段,适合加在任意 Spring 管理的 Bean 中调试:
- 注入
ApplicationContext,然后执行:
applicationContext.containsBean("userService") 或
applicationContext.getBean(UserService.class) - 如果
containsBean返回 false,说明 Bean 没注册;如果getBean抛异常,说明类型不匹配或未找到 - 启动时加
--debug参数,Spring Boot 会输出完整的自动配置报告(ConditionEvaluationReport),能清晰看到哪些配置生效、哪些被跳过、为什么跳过











