Spring注解驱动开发学习总结21:Spring容器创建 - 创建bean的详细步骤

本文详细解读Spring容器创建过程中的finishBeanFactoryInitialization方法,涉及bean的获取、依赖处理、后置处理器应用、bean实例化等关键步骤,带你掌握bean实例化背后的机制。

回顾前3篇文章:
1、Spring注解驱动开发学习总结18:Spring容器创建 - beanFactory创建和预准备工作步骤
分析了Spring容器refresh方法的:
1)刷新前的容器准备:prepareRefresh();
2)刷新内置的bean工厂:obtainFreshBeanFactory();
3)bean工厂的预处理工作:prepareBeanFactory(beanFactory);
4)bean工厂创建并预备好以后的后置处理工作:postProcessBeanFactory(beanFactory);

2、Spring注解驱动开发学习总结19:Spring容器创建 - beanFactory后置处理器的操作步骤
分析了Spring容器refresh方法的:
5)执行beanFactory的后置处理器工作:
invokeBeanFactoryPostProcessors(beanFactory)

3、Spring注解驱动开发学习总结20:Spring容器创建 - 注册bean后置处理器、初始化事件派发器、注册监听器
分析了Spring容器refresh方法的:
6)注册bean后置处理器:registerBeanPostProcessors(beanFactory)
7)初始化MessageSource组件(国际化功能、消息绑定):initMessageSource();
8)初始化事件派发器:initApplicationEventMulticaster();
9)容器刷新方法:onRefresh();
10)注册监听器:registerListeners();

本文接着分析refresh方法
11、创建剩下的单实例bean:finishBeanFactoryInitialization(beanFactory)
12、完成刷新方法:finishRefresh()
在这里插入图片描述

1、分析11步中的finishBeanFactoryInitialization方法

在867行,会先调用beanFactory.preInstantiateSingletons()方法来创建剩下的非懒加载的bean实例
分析preInstantiateSingletons方法
11.1 在735行,先获取容器中所有定义的bean名称
11.2 在729-741行,先获取bean的定义信息:RootBeanDefinition。如果该bean不是抽象的,是单
  实例的,不是懒加载的话,再判断是否是FactoryBean。
  如果是FactoryBean,在742行:factory = getBean(FACTORY_BEAN_PREFIX + beanName);
  如果不是FactoryBean,在761行:getBean(beanName)
  接下来分析如果不是FactoryBean的情况:getBean方法先调用doGetBean(name)方法
11.3 在781行,在bean创建完成后,依次判断bean是否实现了SmartInitializingSingleton接口,如果
  是,就执行它的afterSingletonsInstantiated方法
在这里插入图片描述
在这里插入图片描述

分析11.2中的doGetBean方法

11.2 如果不是FactoryBean的情况:getBean方法先调用doGetBean(name)方法
  分析doGetBean方法
  11.2.1 在243-244行,先尝试从缓存中获取bean:getSingleton(beanName)。
     在getSingleton方法的185行,会从singletonObjects中获取该bean。
     在DefaultSingletonBeanRegistry类的86行,可以得到singletonObjects的定义:
     Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Ob

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值