这边文章介绍了类的加载等相关内容,写的不错 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懒加载

觉得文章有帮助的话就赞赏下吧!

 

微信:

支付宝:

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐