创意电子

标题: Spring之Bean生命周期源码解析 [打印本页]

作者: 海哥聊架构    时间: 2021-9-15 14:40
标题: Spring之Bean生命周期源码解析
Bean的生命周期

Spring最重要的功能就是帮助程序员创建对象(也就是IOC),而启动Spring就是为创建对象做准备,所以我们要先明白Spring到底是怎么去创建Bean的,也就是先弄明白Bean的生命周期。
Bean的生命周期是指:在SpringBean中,一个Bean是如何生成、如何烧毁的。
Bean的生命周期流程如下图所示:

                               
登录/注册后可看大图

1.注册BeanDefinition

BeanDefinition是什么

BeanDefinition中存在许多属性用来描述一个Bean的特点,好比:
为什么需要BeanDefinition

Spring IOC容器本质上是一个ConcurrentHashMap,key为Bean的Name,Value为Bean的实例对象。

                               
登录/注册后可看大图

大概你会说,我通过反射机制实例化一个目标对象,以Bean范例名称为key,目标对象为value,存入IOC容器中,不就可以了吗?Spring为什么要搞这么复杂?
我想,Spring之所以如许计划的目标,是可定制性及扩展性。Spring作为一个容器框架,通过IOC(控制反转)和DI(依赖注入)实现Bean之间依赖关系的管理以及Bean的生命周期管理。要实现Bean依赖关系的管理,必然要辨认出依赖关系,并把这些信息保存下来以供创建Bean实例时使用 ;要实现Bean的生命周期管理,必然要辨认出Bean有哪些生命周期扩展点以及每个扩展点的处理逻辑,并把这些信息保存下来以供创建Bean实例时使用。
这些信息可以看作是Bean的元数据信息,它们应该保存在哪儿呢?
说到这儿,你应该已经恍然大悟了,这些元数据信息就保存在BeanDefinition中,这些元数据信息将会用于指导Bean的创建及生命周期管理。
怎么注册BeanDefinition

在Spring中,我们经常会通过以下几种方式来界说Bean
这些,我们可以称之为声明式界说Bean
我们还可以编程式界说Bean,即直接通过BeanDefinition,好比:

                               
登录/注册后可看大图

我们还可以通过BeanDefinition设置Bean的其他属性,好比:

                               
登录/注册后可看大图

2.合并BeanDefinition

通过扫描得到所有BeanDefinition之后,就可以根据BeanDefinition创建Bean对象了,但是在Spring中支持父子BeanDefinition。
父子BeanDefinition实际用的比较少,使用是如许的,好比:
这么界说的环境下,child是单例Bean。
但是这么界说的环境下,child就是原型Bean了。
由于child的父BeanDefinition是parent,所以会继承parent上所界说的scope属性,当然,其他属性也会继承。而在根据child来生成Bean对象之前,需要进行BeanDefinition的合并,得到完整child的BeanDefinition。
3.加载类

BeanDefinition合并之后,就可以先去创建Bean对象了,而创建Bean就必须先实例化对象,而实例化就必须先加载BeanDefinition中对应的class,在AbstractAutowireCapableBeanFactory类的createBean方法中,一开始就会调用:
Class resolvedClass = resolveBeanClass(mbd, beanName);这行代码就是去加载类,方法是这么实现的:
if (mbd.hasBeanClass()) {    return mbd.getBeanClass();}if (System.getSecurityManager() != null) {    return AccessController.doPrivileged((PrivilegedExceptionAction
作者: oniubi    时间: 2021-9-16 01:45
转发了




欢迎光临 创意电子 (https://wxcydz.cc/) Powered by Discuz! X3.4