spring容器中类的初始化和实例化时机
这边文章介绍了类的加载等相关内容,写的不错https://blog.csdn.net/justloveyou_/article/details/72466105说的spring容器中bean的初始化和实例化也不得不说类的加载机制。上面的链接也很好的说了这一过程。先抽出一部分要点:类加载->连接(验证,准备,解析)->初始化->使用->销毁其中类加载又...
·
这边文章介绍了类的加载等相关内容,写的不错 https://blog.csdn.net/justloveyou_/article/details/72466105
说的spring容器中bean的初始化和实例化也不得不说类的加载机制。
上面的链接也很好的说了这一过程。
先抽出一部分要点:
类加载->连接(验证,准备,解析)->初始化->使用->销毁
其中类加载又涉及到双亲委派机制:这个这里也不做讨论
特别需要指出的是,类的实例化与类的初始化是两个完全不同的概念:
- 类的实例化是指创建一个类的实例(对象)的过程;
- 类的初始化是指为类中各个类成员(被static修饰的成员变量)赋初始值的过程,是类生命周期中的一个阶段。
一般jvm在对类进行加载完成后就会给变量(静态和非静态)赋初始值,比如int类型的 初始值是0 ,引用类型的是null,
public class InstanceInitializer {
private int j = getI();
private int i ; //如果 i的初始值=2时下面i地址也是2但是j还是0
private static final int m=9;
public InstanceInitializer() {
System.out.println(i);
System.out.println(m);
}
private int getI() {
return i;
}
public static void main(String[] args) {
InstanceInitializer ii = new InstanceInitializer();
/*
* 如果我们执行上面这段代码,那么会发现打印的结果是0。
* 因此我们可以确信,变量j被赋予了i的默认值0,
* 这一动作发生在实例变量i初始化之前和构造函数调用之前。
* j获得的是默认值 0
*
* */
System.out.println(ii.j);
}
}
结果:
i=0
m=9
j=0
因为类加载的时候会对变量根据类型赋初始值
好了言归正传 在sprin容器中我们的类又是什么时候进行初始化和实例化的呢?
1 spring中所有bean默认都是单例模式: 所以bean的初始化和实例化都是在加载进入bean容器时做的
2 如果想使用时再初始化 那么可以把类定义为原型模式
@Scope("prototype")或者加上@Lazy默认是true懒加载
觉得文章有帮助的话就赞赏下吧!
微信:
支付宝:
更多推荐
已为社区贡献1条内容
所有评论(0)