0
点赞
收藏
分享

微信扫一扫

ELF文件格式解读及其生成过程(上)

IOC的加载过程主要可以分为两大阶段:1、配置解析,2、Bean的创建

配置解析

先说结论:Spring容器在启动,会去加载解析配置文件(或者析注解扫描)获取到BeanDefinition,再讲BeanDefinition注册到BeanDefinitionRegistry(注册表)。

  • 思考1:Spring怎样读取配置文件

ResourceLoader是一个接口,它定义了一个getResource(String location)方法,用于根据资源位置加载Resource对象。它是Spring资源访问机制的入口点,提供了一种简便的方式来访问和加载资源。

  • 思考2:Spring如何将读取到的配置文件信息解析成BeanDefinition

使用BeanDefinitionReader组件,就是一种读取机制,读取resource文件解析成BeanDefinition

  • 思考3:为什么MergedBeanDefinition合并BeanDefinition

BeanDefinition的合并发生在BeanFactory的preInstantiateSingletons方法中,在实例化bean之前,如果某个bean在定义中设置了parentName,即指定了父BeanDefinition,那么在进行getBean之前,会先进行这两个BeanDefinition的合并。合并后的MergedBeanDefinition包含了子Bean和父Bean的所有配置信息,确保了在实例化子Bean时,能够正确地应用所有的配置。

Bean的创建

Bean的生命周期包括Bean的创建、存活、销毁的过程,创建就是实例化的过程,存活包括属性赋值和初始化,所以又说Bean的生命周期为:实例化、属性赋值、初始化和销毁

  • 思考1:实例化过程做了什么

解析完配置元信息后,Spring会根据BeanDefinition中的信息实例化Bean。这一步通常通过反射机制完成。如果Bean有依赖关系,Spring会先实例化这些依赖的Bean,然后再实例化当前Bean‌。

  • 思考2:属性赋值做了什么

对属性值进行修改,获取被@AutoWried,@Value,@PostConstruct等元信息(实例化解析出来的),并注入

  • 思考3:上一阶段已经属性赋值了,为什么还需要初始化

因为Bean的初始化阶spring允许用户可以自定义初始化方法,在初始化方法前后也能增加逻辑。

  • 思考4:初始化做了什么

执行初始化方法:比如@PostContruct标注的方法,或者实现InitializingBean中afterPropertiesSet()方法

面试题

举报

相关推荐

0 条评论