@Autowired和构造方法执行的顺序解析
程序员文章站
2022-05-08 17:46:01
...
先看一段代码,下面的代码能运行成功吗?
@Autowired
private User user;
private String school;
public UserAccountServiceImpl(){
this.school = user.getSchool();
}
答案是不能。因为Java类会先执行构造方法,然后再给注解了@Autowired 的user注入值,所以在执行构造方法的时候,就会报错。
报错信息可能会像下面:
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name '...' defined in file [....class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [...]: Constructor threw exception; nested exception is java.lang.NullPointerException
报错信息说:创建Bean时出错,出错原因是实例化bean失败,因为bean时构造方法出错,在构造方法里抛出了空指针异常。
解决办法是,使用构造器注入,如下:
private User user;
private String school;
@Autowired
public UserAccountServiceImpl(User user){
this.user = user;
this.school = user.getSchool();
}
总结:
1、Java变量的初始化顺序为:静态变量或静态语句块–>实例变量或初始化语句块–>构造方法
上一篇: 妈妈,我不舒服
下一篇: 线程中断机制,精确控制方法执行
推荐阅读
-
关于静态语句块、非静态语句块,成员变量初始化、构造方法在父子类执行的顺序:
-
JavaScript的解析机制和执行顺序介绍
-
静态方法和构造方法的执行顺序以及代码块的区分
-
关于静态代码块,构造代码块,构造方法,普通代码块的一些概念和执行顺序
-
关于静态语句块、非静态语句块,成员变量初始化、构造方法在父子类执行的顺序:
-
spring5 源码深度解析----- AOP目标方法和增强方法的执行(100%理解AOP)
-
JavaScript的解析机制和执行顺序介绍
-
JAVA中继承时静态代码块、构造代码块与构造方法的执行顺序
-
C++在单继承、多继承、虚继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容...
-
Java父类和子类构造方法的调用顺序