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

Spring依赖注入练习报错找不到HelloWorld类型Bean该如何解决

错误原因

  • 重复启动Spring容器:你先后两次调用SpringApplication.run()生成了两个完全隔离的Spring上下文,第二个仅加载Person类的上下文里没有HelloWorld的Bean,自然找不到依赖。
  • @Autowired使用错误:@Autowired是用来将依赖注入到类的成员变量/构造方法的,不能标注在普通业务方法printMessage上。
  • 多余的@Bean注解:HelloWorld类的getMessage是普通getter方法,不需要加@Bean注解,该注解是用来向容器注册第三方组件的,加在getter上属于误用。

修正后的代码

HelloWorld.java

@Component
public class HelloWorld {
    
    private String message="";  

    public void setMessage(String message) {
        this.message = message;
    }

    // 去掉多余的@Bean注解
    public String getMessage() {
        return message;
    }
}

Person.java

@Component
public class Person {
    // 将HelloWorld注入为成员变量,@Autowired加在这里
    @Autowired
    private HelloWorld helloWorld;
    
    private String person="Jessy";
    
    public void setPerson(String person) {
        this.person = person;
    }
    
    // 普通业务方法,不需要@Autowired,直接用注入的helloWorld对象
    public String printMessage() {
        return helloWorld.getMessage()+" - "+this.person;
    }
}

TestApplication.java

@ComponentScan(value={"com.example.bean"})
@SpringBootApplication // 补充SpringBoot启动类必备注解
public class TestApplication {

    public static void main(String[] args) {
        // 只启动一次容器,用启动类TestApplication作为参数,两个Bean都会被扫描加载
        ApplicationContext context = SpringApplication.run(TestApplication.class, args);
        HelloWorld word=context.getBean(HelloWorld.class);
        word.setMessage("hi world");
        
        Person person=context.getBean(Person.class);
        person.setPerson("Jimbey");
        // 直接调用printMessage即可,不需要手动传word参数
        System.out.println(person.printMessage());
    }

}

运行验证

修正后启动项目,控制台会输出:hi world - Jimbey,符合预期目标。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 03:45:03