bean 初始化<clinit><init> 初探

bean 初始化<clinit> <init> 初探

java文件编译后会为每个类自动生成一个<clinit>和<init>函数。

<clinit> 函数是在类第一次加载到jvm方法区的时候调用,实现对类中的一些静态变量赋值以及执行静态语句块。

<init>是在对象实例初始化时候调用,对类中的一些变量赋值以及执行一些语句块。

我们还可以通过在Spring中配置的init-method,以便在bean初始化完全之前做一些操作。配置格式如下

<bean id="beanInit" class="com.study.BeanInit" init-method="init" destroy-method="destory"></bean>

实验示例代码:

public class BeanInit{
    private String init;
    {
        init = "init";//<init>
    }
    static private String cinit;
    static {
        cinit = "cinit";//<clinit>
    }
    private void init(){
        init = "init-method";//init
    }
    private void destory(){
    }
}

这里写图片描述
这里写图片描述
这里写图片描述

单步调试,观察堆栈信息

首先被调用的是<clinit>函数。

其次被调用的是<init>函数。

最后是init。

(——这里编译生成的<init>是有一堆尖括号的,而我们自己定义的是init)

发现<clinit>和<init>的调用栈是一致的,都是在构造函数Constructor函数中被调用。

spring在获取对象实例的时候,会调用类的构造函数Constructor,此时发现该类并没有加载至内存,于是classLoader这时会加载这个类,而<clinit>就是在加载过程的初始化这一步被调用的,用来初始化这个类,这时该类已经加载在内存里,接下来便会触发<init>来初始化这个对象。

这里的Constructor函数是编译器自动生成的默认无参数的构造函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值