title: Spring Bean的创建初始化过程–源码分析
date: 2020-04-20 19:59:24
tags:Spring
bean
的生命周期简单来说:
bean创建—初始化----销毁的过程
Bean的创建初始化
当完成了Spring
容器的初始化以及BeanDefinition
的搜集入库后,Spring
就会开始一部分bean
的创建与初始化。
(1)refresh()
中
//在Spring的启动方法refresh()中,最后会调用此方法,完成内部持有的beanFactory的初始化,并且完成所有的非懒加载的单例bean的实例化
finishBeanFactoryInitialization(beanFactory);
(2)finishBeanFactoryInitialization(beanFactory)
中
//完成所有的非懒加载的单例bean的实例化
beanFactory.preInstantiateSingletons();
(3)beanFactory.preInstantiateSingletons()
中
//首先获取beanDefinition的name集合
//在Spring容器(DefaultListableBeanFactory)中会持有两个关于beanDefinition相关的集合对象
//beanDefinitionMap和beanDefinitionNames,一个为Map,一个为List,这样的目的就是为了保存bean的注册顺序
//private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
//private volatile List<String> beanDefinitionNames = new ArrayList<>(256);
List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
//遍历集合
for (String beanName : beanNames) {
//从beanDefinitionMap获取beanDefinition
RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
//如果这个bean不是抽象的、不是懒加载的、是单例的,就进行实例化
if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
//bean是否为FactoryBean
if (isFactoryBean(beanName)) {
//获取这个bean的factoryBean,“&”+beanName
Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
if (bean instanceof FactoryBean) {
。。。。。