Spring Boot启动报BeanInstantiationException空指针异常问题求解
错误根本原因
创建名为'alien'的bean失败,该bean定义在文件[E:\Programing\Java\boot\Project1\target\classes\com\example\demo\Alien.class]中:bean实例化失败;嵌套异常为org.springframework.beans.BeanInstantiationException:无法实例化[com.example.demo.Alien]:构造函数抛出异常;嵌套异常为java.lang.NullPointerException:无法调用"com.example.demo.Laptop.compile()",因为"this.laptop"为null
报错核心是Spring Bean的实例化、注入顺序逻辑问题:
- Spring创建Bean的流程是:先调用类的构造方法生成对象实例 → 再对
@Autowired标记的字段执行依赖注入 - 你在Alien类的无参构造方法里直接调用
laptop.compile(),此时构造方法还在执行阶段,字段注入尚未触发,laptop属性还是null,自然抛出空指针异常。
解决方案
方案1:使用构造函数注入(官方推荐)
Spring 4.3+版本后,若类仅存在一个构造函数,不需要显式加@Autowired注解,Spring会自动完成构造参数的注入,修改Alien类代码如下:
@Component public class Alien { private int id; private String name; private String tech; private Laptop laptop; // 移除字段上的@Autowired注解 // 构造参数传入Laptop,Spring自动注入对应实例 public Alien(Laptop laptop) { super(); System.out.println("Object Created......"); this.laptop = laptop; laptop.compile(); // 此时laptop已经被传入,不会为空 } // 剩余的getter、setter、show方法保持原有逻辑不变 }
方案2:用@PostConstruct注解执行初始化逻辑
如果不想修改原有构造方法,就把需要依赖注入完成后再执行的逻辑,放到加了@PostConstruct注解的方法中,该方法会在Bean所有属性注入完成后自动触发:
@Component public class Alien { private int id; private String name; private String tech; @Autowired private Laptop laptop; public Alien() { super(); System.out.println("Object Created......"); // 移除构造方法里的laptop.compile()调用 } // 新增初始化方法,依赖注入完成后自动执行 @PostConstruct public void init() { laptop.compile(); // 此时laptop已经注入完成 } // 剩余的getter、setter、show方法保持原有逻辑不变 }
内容的提问来源于stack exchange,提问作者Sharman Jeurkar
相关产品推荐
相关产品推荐

