手撕Spring源码解析Bean的生命周期

这里我们主要分析生命周期从以下方法进入:
bean的实例化(开辟内存空间)-》bean的属性填充-》bean的初始化;
SpringBean的加载肯定是找到Bean的定义信息,来源有xml、yml等文件;
调用如下入口方法,加载配置文件进入源码解析;
先缕清大体脉络,后深入;
入口

ClassPathXmlApplicationContext()创建spring以用程序上下文,
调用构造方法,设置配置文件路径到当前应用程序中,开始进入容器的创建和刷新环节 refresh();
AbstractApplicationContext()的refresh();

bean的生命周期从创建到销毁共12个流程方法,总体流程脉络如下:

// 刷新spring容器前的准备,例如清空缓存
prepareRefresh();
// 获取一个全新的工厂bean
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// 设置一些bean工厂的属性 lijiaqi
prepareBeanFactory(beanFactory);
// 注册bean的增强器
postProcessBeanFactory(beanFactory);

// 调用上面注册的bean工厂的增强器(bean工厂)
invokeBeanFactoryPostProcessors(beanFactory);

// 注册所有的 Bean 后处理器(bean)
registerBeanPostProcessors(beanFactory);

// 用于初始化消息源 !
initMessageSource();

// 用于初始化事件多播器!
initApplicationEventMulticaster();

// 模板方法模式,用于执行特定方法
onRefresh();

// 注册所有的监听器
registerListeners();

// 完成非惰性单例的实例化
finishBeanFactoryInitialization(beanFactory);

// 发布相应的事件
finishRefresh();

bean的实例化主要方法(spring最易懂,只有do开头才是干事的方法)
记住下面流程的方法顺序我们在源码中找出来


getBean()->doGetBean()->createBean()->doCreateBean()->createBeanInstance()->instantiateBean()->instantiate()->BeanUtils.instantiateClass(constructorToUse)->ctor.newInstance(argsWithDefaultValues)->T inst = (T) ca.newInstance(initargs);
 

开始深入实例化方法的解析:
手撕Spring源码解析Bean的生命周期_第1张图片

进入之后主要看最后的方法往里进,需要看两个地方
手撕Spring源码解析Bean的生命周期_第2张图片

// Initialize LoadTimeWeaverAware beans early to allow for registering their transformers early.
// 从容器中获取了所有实现了LoadTimeWeaverAware接口的bean名称(需要增强的bean实现的接口)
// 初始化这些bean,这些bean收到通知注册各自的类和相关切入点
String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);
for (String weaverAwareName : weaverAwareNames) {
    getBean(weaverAwareName);
}
// 实例化所有剩余(非惰性初始化)单例。
beanFactory.preInstantiateSingletons();
进入看到我们的getBean()


工厂bean和普通单例bean走不同的getBean()
进去看见我们的doGetBean()

 经过一系列判断看到我们的createBean(),创建bean的实例对象
这里强调一下

sharedInstance = getSingleton(beanName, () -> {
    try {
       //入口
       return createBean(beanName, mbd, args);
    }

传入的是一个lambda表达式,在接收的参数对象调用其唯一抽象方法时调用;
在解释一下mbd,是RootBeanDefinition类型的,MBD(MergedBeanDefinition)表示合并后的BeanDefinition。在Spring容器中,一个bean可以有一个或多个BeanDefinition,例如,在多个配置文件或注解中定义同一个bean。在这种情况下,Spring容器需要合并这些BeanDefinition以创建一个统一的BeanDefinition,这就是MBD的作用。
手撕Spring源码解析Bean的生命周期_第3张图片

 之后就是我们的doCreateBean();
手撕Spring源码解析Bean的生命周期_第4张图片
手撕Spring源码解析Bean的生命周期_第5张图片
反射创建对象,
instantiateBean(beanName,mbd)->使用其默认构造函数实例化给定的 Bean
->instantiate(mdb,beanName,beanFactory)->获取其构造器传入BeanUtils.instantiateClass(constructorToUse);
手撕Spring源码解析Bean的生命周期_第6张图片
手撕Spring源码解析Bean的生命周期_第7张图片
手撕Spring源码解析Bean的生命周期_第8张图片
手撕Spring源码解析Bean的生命周期_第9张图片

 一层层返回到拿到一个BeanWrapper
BeanWrapper是Spring提供的一个用来操作JavaBean属性的工具类
对合成后的MergedBeanDefinition进行一些后置处理
手撕Spring源码解析Bean的生命周期_第10张图片

 三级缓存在拿到实例化对象后
手撕Spring源码解析Bean的生命周期_第11张图片
 

填充属性
populateBean(beanName, mbd, instanceWrapper);

你可能感兴趣的:(spring,java,数据库)