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
相关产品推荐
相关产品推荐

