You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring依赖注入报错:No qualifying bean of type available问题求助

解决Spring依赖注入报错:No qualifying bean of type available

错误原因

你遇到的异常是因为手动创建的AnnotationConfigApplicationContext仅注册了Controller类,未包含Service类,导致Spring在该上下文里找不到可注入的Service Bean。同时你重复启动了Spring Boot默认上下文和手动上下文,这是冗余且错误的操作。

解决方案

方案1:使用Spring Boot默认上下文(推荐)

直接利用SpringApplication.run()返回的上下文获取Bean,@SpringBootApplication会自动扫描当前包及其子包下的@Component类,你的Service和Controller都在同一包下,会被自动注册为Bean:

@SpringBootApplication
public class SpringTest2Application {
   public static void main(String[] args) {
      ConfigurableApplicationContext ctx = SpringApplication.run(SpringTest2Application.class, args);
      Controller ctrl = ctx.getBean(Controller.class);
      ctrl.doServiceByController();
   }
}

方案2:修正手动创建的上下文(不推荐,除非特殊场景)

如果必须手动创建上下文,需要确保Service也被注册到该上下文中,有两种方式:

  • 方式一:显式注册Service类
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(Controller.class);
ctx.register(Service.class); // 新增注册Service
ctx.refresh();
Controller ctrl = ctx.getBean(Controller.class);
ctrl.doServiceByController();
  • 方式二:开启组件扫描,指定你的包路径
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.scan("net.ddns.encante.test2.Spring.SpringTest2"); // 扫描包下所有@Component类
ctx.refresh();
Controller ctrl = ctx.getBean(Controller.class);
ctrl.doServiceByController();

额外建议

  • 避免同时启动多个Spring上下文,会造成资源浪费和逻辑混乱;
  • 建议将类中的方法改为public修饰符,虽然Spring支持非public的Bean方法,但保持public是更规范的开发习惯,比如修改Service的doService()和Controller的相关方法。

内容的提问来源于stack exchange,提问作者Enc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 01:35:21